Introduction
Goals of the project
In this project, we present a state-level overview of the expansion of health insurance in the United States and its effects on health outcomes and cost outcomes, from 2008 to 2015 under President Obama’s term. One of the hallmarks of Obama’s presidency was the passage and implementation of the Affordable Care Act (ACA) to increase health insurance coverage and regulate healthcare provision to protect consumers’ rights. In addition, we are also interested in how people perceive the (ACA), as seen from articles related to the ACA from the New York Times.
Research Questions:
Trends of health insurance expansion in the United States: How has the percentage of uninsured Americans changed overall, and differentially by states, from 2008 to 2015? How has the composition of healthcare sources changed?
Health outcomes: How do the states compare in health outcomes, such as mortality rates and access to preventative and remedying treatments?
Financial outcomes: How do the states compare in financial and cost outcomes, such as the containment of out-of-pocket costs, insurance premium growth and government spending?
Perceptions of the ACA: We used API to download articles realted to ACA on New York Times from 2011-2017 and transformed them into a corpus to conduct a text analysis. How has the overall trend of public attention changed over the years, as seen by the number of articles relating to the ACA? What topics do people focus on when they discuss the ACA?
Overview of the Affordable Care Act in the United States
The Patient Protection and Affordable Care Act (ACA), also commonly known as Obamacare, was a major and wide-sweeping healthcare reform initiative enacted by Preseident Obama. The ACA was signed into law by Obama on March 23, 2010, and changes were gradually implemented over the next few years, though the majority of the provisions went into effect only on January 1, 2014.
The major goal of the ACA is to expand health insurance and healthcare access to those who otherwise did not have access, including the 45 million Americans who were uninsured before the ACA took effect. In addition, it also covers wide-ranging regulations for the protection of healthcare consumer rights. Prior to the ACA, many low-income Americans we unable to afford any health insurance, while people with disabilities and pre-existing conditions may have been denied coverage by insurerers.
The key provisions of the ACA include
Employer mandate: Employers with more than 50 employees are required to provide health insurance to full-time workers, or would otherwise face a fine
Individual mandate: Individuals must obtain “minimum essential coverage” for healthcare, and those without health insurance must pay a fine in their annual tax returns to the IRS
State and federal marketplaces: These health insurance exchanges were set-up to enable people “shopping” for insurance to make easy comparisons among the insurance plans available, thus inreasing competition in the marketplace as well.
Medicaid expansion: The ACA expands medicaid to all individuals earning less than 138% of the federal poverty level (FPL), enabled first by federal funding and . After the Supreme Court ruled this requirement as unconstitutional (thus optional) in 2012, 31 states have elected to expand medicaid, while 19 have not.
Federal subsidies to people earning between 138% and 400% of the FPL to afford monthly health insurance premiums.
Regulations preventing insurance companies from discriminating in price and provision based on people’s age, gender, or pre-existing conditions
These provisions of the ACA make health insurance accessible and affordable to people previously without coverage. In addition, people who already have health insurance would also benefit from increased choice, a cap on out-of-pocket expenses, as well as more comprehensive coverage, as insurance is now required to cover more basic treatments than before.
However, this increased coverage comes at a cost of increased premium growths for consumers, and increases in federal spending. The expansion of health insurance and healthcare coverage is projected to cost of the U.S. government up to $1.34 trillion over the next decade. It is thus no surprise that the States fall on various sides of the political spectrum when it comes to support for medicaid.
(1) Health Insurance Coverage
Figure 1
Access our Shiny App on Uninsured Rates in the United States from 2008-2015.
Figure 2
The following figure displays the trend in the uninsured rate between 2008 and 2015. Results are shown for the USA average (in black), as well as for every individual state (in color).
We see a clear downward trend in the uninsured rate once most of the Affordable Care Act (ACA) provisions were implemented in 2014. The overall US uninsured rate decreased from 18.2% in 2010 to 10.5% in 2015.
However, note that the disparities in uninsured rates largely continue to persist among the states, with regional patterns (using Bureau of Economic Analysis (BEA) regions). States of the Southeast and Southwest consistently had the highest uninsured rates, while states of New England consistenely had the lowest insured or highest health insurance coverage rates.
Figure 3
In the following plot, I explore the difference between Democratic and Republican states, based on the 2012 US Presidential Election results. Generally, the democratic states consistently have had largely have a lower uninsured rate than the Republican states, though both groups experienced declines in the uninsured rates in 2014. The rate of decline of uninsured rates in 2014 for many Republican states appeared to exceed that of the Democratic states, mainly because of their higher starting point.
Figure 4
This plot shows insured rates in 2015 at a glance, looking at how they differ by party (2012 winner), BEA region and income level of the states.
In terms of correlations, it appears that being a Democratic state is a strong predictor of a higher insurance rate. States in New England, the Mideast and the Great Lakes perform well in insurance rates, while states in the Southwest, Rocky Mountains and Southeast perform the poorest. As expected, high-income states have the highest insurance rates as more people would be able to afford insurance. Lower and lower-middle income states have lower coverage rates, but it is infact the lower-middle income states that have the lowest insurance rates.

Figure 5
Next, we investigate the main health insurance and coverage sources, namely employer coverage, the individual marketplace, Medicaid / Childrens’ Health Insurance Program (CHIP), and Medicare for the aged. We broke down the results by party and income level, taking a simple (unweighted) average across the states in the categories. We observe that employer coverage rates increase as income level increases, especially for Democratic states. Democratic and low income states have more people on Medicaid / CHIP than Republican and low income states.
(2) Health Outcomes and Access
Figure 6
Next, we are interested to find out how health insurance rates correlates with health outcomes. In particular, we can look at the measure of mortality amenable to healthcare intervention - the number of deaths that could have been prevented by healthcare in the year 2014. We plot avoidable mortality (2014) against insurance rates (2014) and observe a negative relationship as expected. States that have higher rates of insurance also have better health in this respect. However, we also control for income levels as low income levels would be a major predictor of poor health, as confirmed in our plot. Yet, within each income level, the negative relationship remains, and it is especially pronounced among the upper-middle income countries.

Figure 7
The following maps how the states performed in various health outcomes, namely preventable mortality, access to a usual source of care, rate of age-appropriate cancer screenings in adults, and rate of age-appropriate vaccinations in adults. A green color incidates a comparatively more favorable outcome, while a red color indicates a less favorable outcome.
We note that the Northeast (New England) states perform consistently well across all health outcomes, while the Southeast states, as well as Texes, peform consistently poorly on all except for vaccination rates. The Western and Rocky Mountains states have a low avoidable mortality rate, despite having low rates of access to usual care and of cancer screening and vaccinations. In the measure of adult vaccination rates, the trend of the South faring poorer on health is reversed, as they do comparatively well in vaccinations.
(3) Affordability and Cost Outcomes
Figure 8
Similarly, we map how the states performed in various financial and cost outcomes, such as percentage of people with high OOP costs relative to household income, premium growth rates, affordability of the marketplace plans, and increases in federal spending related to the state.
We notice that states that do better in containing OOP costs tend to do worse in containing premium and marketplace plan rates as well as federal spending. These include some states like New York, New Jersey and Ohio in the Northeast and Midwest (Great Lakes). A notable exception is Massachussets, which performs well across the financial measures, possibly because of the headstart it got with “Romney-care”, which actually served as a model for Obamacare.
(4) Perceptions of ACA (Text Analysis)
Text analysis: Media and the Affordable care act
We are also interested in how people think about Affordable care act(ACA). We want to have a look of the tweets and newspaper related to ACA. To realize this, we use API to download articles realted to ACA on New york times from 2011-2017 and transform them into corpus to do the text analysis.
Research Questions: 1) The overll trend of publuc attention, which can be shown as the number of articles related to ACA in different years. 2) What people discuss about when they discuss ACA, which can be shown as the word frequencies.
We could see that people discussed ACA a lot when obama first signed it, and the election in 2017 made it a hot topic again. And not suprisingly, peopel always talk about Trump when they talk about ACA
Figure 17
We could see that people discussed ACA a lot when Obama first signed it, and the election in 2017 made it a hot topic again. And not suprisingly, people always talk about Trump when they talk about ACA.

Figure 18

Figure 19
Wordcloud by Year

LS0tCnRpdGxlOiAiRGF0YSBWaXN1YWxpemF0aW9uIEZpbmFsIFByb2plY3Q6IFxuSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSBpbiB0aGUgVW5pdGVkCiAgU3RhdGVzIgphdXRob3I6ICJHcmFjZSBLb25nLCBJcmlzIENoZW4gJiBGYW5nIExpdSAoR3JvdXAgUCkiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KICAgICAKIyBJbnRyb2R1Y3Rpb24KCiMjIEdvYWxzIG9mIHRoZSBwcm9qZWN0CgpJbiB0aGlzIHByb2plY3QsIHdlIHByZXNlbnQgYSBfc3RhdGUtbGV2ZWwgb3ZlcnZpZXdfIG9mIHRoZSBleHBhbnNpb24gb2YgaGVhbHRoIGluc3VyYW5jZSBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgaXRzIGVmZmVjdHMgb24gaGVhbHRoIG91dGNvbWVzIGFuZCBjb3N0IG91dGNvbWVzLCBmcm9tIDIwMDggdG8gMjAxNSB1bmRlciBQcmVzaWRlbnQgT2JhbWEncyB0ZXJtLiBPbmUgb2YgdGhlIGhhbGxtYXJrcyBvZiBPYmFtYSdzIHByZXNpZGVuY3kgd2FzIHRoZSBwYXNzYWdlIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgX19BZmZvcmRhYmxlIENhcmUgQWN0IChBQ0EpX18gdG8gaW5jcmVhc2UgaGVhbHRoIGluc3VyYW5jZSBjb3ZlcmFnZSBhbmQgcmVndWxhdGUgaGVhbHRoY2FyZSBwcm92aXNpb24gdG8gcHJvdGVjdCBjb25zdW1lcnMnIHJpZ2h0cy4gSW4gYWRkaXRpb24sIHdlIGFyZSBhbHNvIGludGVyZXN0ZWQgaW4gaG93IHBlb3BsZSBwZXJjZWl2ZSB0aGUgKEFDQSksIGFzIHNlZW4gZnJvbSBhcnRpY2xlcyByZWxhdGVkIHRvIHRoZSBBQ0EgZnJvbSB0aGUgTmV3IFlvcmsgVGltZXMuCgpfX1Jlc2VhcmNoIFF1ZXN0aW9uczpfXwoKMSkgX1RyZW5kcyBvZiBoZWFsdGggaW5zdXJhbmNlIGV4cGFuc2lvbiBpbiB0aGUgVW5pdGVkIFN0YXRlc186IEhvdyBoYXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdW5pbnN1cmVkIEFtZXJpY2FucyBjaGFuZ2VkIG92ZXJhbGwsIGFuZCBkaWZmZXJlbnRpYWxseSBieSBzdGF0ZXMsIGZyb20gMjAwOCB0byAyMDE1PyBIb3cgaGFzIHRoZSBjb21wb3NpdGlvbiBvZiBoZWFsdGhjYXJlIHNvdXJjZXMgY2hhbmdlZD8KCjIpIF9IZWFsdGggb3V0Y29tZXNfOiBIb3cgZG8gdGhlIHN0YXRlcyBjb21wYXJlIGluIGhlYWx0aCBvdXRjb21lcywgc3VjaCBhcyBtb3J0YWxpdHkgcmF0ZXMgYW5kIGFjY2VzcyB0byBwcmV2ZW50YXRpdmUgYW5kIHJlbWVkeWluZyB0cmVhdG1lbnRzPwoKMykgX0ZpbmFuY2lhbCBvdXRjb21lc186IEhvdyBkbyB0aGUgc3RhdGVzIGNvbXBhcmUgaW4gZmluYW5jaWFsIGFuZCBjb3N0IG91dGNvbWVzLCBzdWNoIGFzIHRoZSBjb250YWlubWVudCBvZiBvdXQtb2YtcG9ja2V0IGNvc3RzLCBpbnN1cmFuY2UgcHJlbWl1bSBncm93dGggYW5kIGdvdmVybm1lbnQgc3BlbmRpbmc/Cgo0KSBfUGVyY2VwdGlvbnMgb2YgdGhlIEFDQV86IFdlIHVzZWQgQVBJIHRvIGRvd25sb2FkIGFydGljbGVzIHJlYWx0ZWQgdG8gQUNBIG9uIE5ldyBZb3JrIFRpbWVzIGZyb20gMjAxMS0yMDE3IGFuZCB0cmFuc2Zvcm1lZCB0aGVtIGludG8gYSBjb3JwdXMgdG8gY29uZHVjdCBhIHRleHQgYW5hbHlzaXMuIEhvdyBoYXMgdGhlIG92ZXJhbGwgdHJlbmQgb2YgcHVibGljIGF0dGVudGlvbiBjaGFuZ2VkIG92ZXIgdGhlIHllYXJzLCBhcyBzZWVuIGJ5IHRoZSBudW1iZXIgb2YgYXJ0aWNsZXMgcmVsYXRpbmcgdG8gdGhlIEFDQT8gV2hhdCB0b3BpY3MgZG8gcGVvcGxlIGZvY3VzIG9uIHdoZW4gdGhleSBkaXNjdXNzIHRoZSBBQ0E/CgojIyBPdmVydmlldyBvZiB0aGUgQWZmb3JkYWJsZSBDYXJlIEFjdCBpbiB0aGUgVW5pdGVkIFN0YXRlcwoKVGhlIF9fUGF0aWVudCBQcm90ZWN0aW9uIGFuZCBBZmZvcmRhYmxlIENhcmUgQWN0IChBQ0EpX18sIGFsc28gY29tbW9ubHkga25vd24gYXMgT2JhbWFjYXJlLCB3YXMgYSBtYWpvciBhbmQgd2lkZS1zd2VlcGluZyBoZWFsdGhjYXJlIHJlZm9ybSBpbml0aWF0aXZlIGVuYWN0ZWQgYnkgUHJlc2VpZGVudCBPYmFtYS4gVGhlIEFDQSB3YXMgc2lnbmVkIGludG8gbGF3IGJ5IE9iYW1hIG9uIE1hcmNoIDIzLCAyMDEwLCBhbmQgY2hhbmdlcyB3ZXJlIGdyYWR1YWxseSBpbXBsZW1lbnRlZCBvdmVyIHRoZSBuZXh0IGZldyB5ZWFycywgdGhvdWdoIHRoZSBtYWpvcml0eSBvZiB0aGUgcHJvdmlzaW9ucyB3ZW50IGludG8gZWZmZWN0IG9ubHkgb24gSmFudWFyeSAxLCAyMDE0LiAgIAoKVGhlIG1ham9yIGdvYWwgb2YgdGhlIEFDQSBpcyB0byBleHBhbmQgaGVhbHRoIGluc3VyYW5jZSBhbmQgaGVhbHRoY2FyZSBhY2Nlc3MgdG8gdGhvc2Ugd2hvIG90aGVyd2lzZSBkaWQgbm90IGhhdmUgYWNjZXNzLCBpbmNsdWRpbmcgdGhlIDQ1IG1pbGxpb24gQW1lcmljYW5zIHdobyB3ZXJlIHVuaW5zdXJlZCBiZWZvcmUgdGhlIEFDQSB0b29rIGVmZmVjdC4gSW4gYWRkaXRpb24sIGl0IGFsc28gY292ZXJzIHdpZGUtcmFuZ2luZyByZWd1bGF0aW9ucyBmb3IgdGhlIHByb3RlY3Rpb24gb2YgaGVhbHRoY2FyZSBjb25zdW1lciByaWdodHMuIFByaW9yIHRvIHRoZSBBQ0EsIG1hbnkgbG93LWluY29tZSBBbWVyaWNhbnMgd2UgdW5hYmxlIHRvIGFmZm9yZCBhbnkgaGVhbHRoIGluc3VyYW5jZSwgd2hpbGUgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIGFuZCBwcmUtZXhpc3RpbmcgY29uZGl0aW9ucyBtYXkgaGF2ZSBiZWVuIGRlbmllZCBjb3ZlcmFnZSBieSBpbnN1cmVyZXJzLiAgIAoKX19UaGUga2V5IHByb3Zpc2lvbnMgb2YgdGhlIEFDQSBpbmNsdWRlX18gIAoKX0VtcGxveWVyIG1hbmRhdGVfOiBFbXBsb3llcnMgd2l0aCBtb3JlIHRoYW4gNTAgZW1wbG95ZWVzIGFyZSByZXF1aXJlZCB0byBwcm92aWRlIGhlYWx0aCBpbnN1cmFuY2UgdG8gZnVsbC10aW1lIHdvcmtlcnMsIG9yIHdvdWxkIG90aGVyd2lzZSBmYWNlIGEgZmluZQoKX0luZGl2aWR1YWwgbWFuZGF0ZV86IEluZGl2aWR1YWxzIG11c3Qgb2J0YWluICJtaW5pbXVtIGVzc2VudGlhbCBjb3ZlcmFnZSIgZm9yIGhlYWx0aGNhcmUsIGFuZCB0aG9zZSB3aXRob3V0IGhlYWx0aCBpbnN1cmFuY2UgbXVzdCBwYXkgYSBmaW5lIGluIHRoZWlyIGFubnVhbCB0YXggcmV0dXJucyB0byB0aGUgSVJTCgpfU3RhdGUgYW5kIGZlZGVyYWwgbWFya2V0cGxhY2VzXzogVGhlc2UgaGVhbHRoIGluc3VyYW5jZSBleGNoYW5nZXMgd2VyZSBzZXQtdXAgdG8gZW5hYmxlIHBlb3BsZSAic2hvcHBpbmciIGZvciBpbnN1cmFuY2UgdG8gbWFrZSBlYXN5IGNvbXBhcmlzb25zIGFtb25nIHRoZSBpbnN1cmFuY2UgcGxhbnMgYXZhaWxhYmxlLCB0aHVzIGlucmVhc2luZyBjb21wZXRpdGlvbiBpbiB0aGUgbWFya2V0cGxhY2UgYXMgd2VsbC4KCl9NZWRpY2FpZCBleHBhbnNpb25fOiBUaGUgQUNBIGV4cGFuZHMgbWVkaWNhaWQgdG8gYWxsIGluZGl2aWR1YWxzIGVhcm5pbmcgbGVzcyB0aGFuIDEzOCUgb2YgdGhlIGZlZGVyYWwgcG92ZXJ0eSBsZXZlbCAoRlBMKSwgZW5hYmxlZCBmaXJzdCBieSBmZWRlcmFsIGZ1bmRpbmcgYW5kIC4gQWZ0ZXIgdGhlIFN1cHJlbWUgQ291cnQgcnVsZWQgdGhpcyByZXF1aXJlbWVudCBhcyB1bmNvbnN0aXR1dGlvbmFsICh0aHVzIG9wdGlvbmFsKSBpbiAyMDEyLCAzMSBzdGF0ZXMgaGF2ZSBlbGVjdGVkIHRvIGV4cGFuZCBtZWRpY2FpZCwgd2hpbGUgMTkgaGF2ZSBub3QuCgpfRmVkZXJhbCBzdWJzaWRpZXNfIHRvIHBlb3BsZSBlYXJuaW5nIGJldHdlZW4gMTM4JSBhbmQgNDAwJSBvZiB0aGUgRlBMIHRvIGFmZm9yZCBtb250aGx5IGhlYWx0aCBpbnN1cmFuY2UgcHJlbWl1bXMuCgpfUmVndWxhdGlvbnNfIHByZXZlbnRpbmcgaW5zdXJhbmNlIGNvbXBhbmllcyBmcm9tIGRpc2NyaW1pbmF0aW5nIGluIHByaWNlIGFuZCBwcm92aXNpb24gYmFzZWQgb24gcGVvcGxlJ3MgYWdlLCBnZW5kZXIsIG9yIHByZS1leGlzdGluZyBjb25kaXRpb25zCgpUaGVzZSBwcm92aXNpb25zIG9mIHRoZSBBQ0EgbWFrZSBoZWFsdGggaW5zdXJhbmNlIGFjY2Vzc2libGUgYW5kIGFmZm9yZGFibGUgdG8gcGVvcGxlIHByZXZpb3VzbHkgd2l0aG91dCBjb3ZlcmFnZS4gSW4gYWRkaXRpb24sIHBlb3BsZSB3aG8gYWxyZWFkeSBoYXZlIGhlYWx0aCBpbnN1cmFuY2Ugd291bGQgYWxzbyBiZW5lZml0IGZyb20gaW5jcmVhc2VkIGNob2ljZSwgYSBjYXAgb24gb3V0LW9mLXBvY2tldCBleHBlbnNlcywgYXMgd2VsbCBhcyBtb3JlIGNvbXByZWhlbnNpdmUgY292ZXJhZ2UsIGFzIGluc3VyYW5jZSBpcyBub3cgcmVxdWlyZWQgdG8gY292ZXIgbW9yZSBiYXNpYyB0cmVhdG1lbnRzIHRoYW4gYmVmb3JlLgoKSG93ZXZlciwgdGhpcyBpbmNyZWFzZWQgY292ZXJhZ2UgY29tZXMgYXQgYSBjb3N0IG9mIGluY3JlYXNlZCBwcmVtaXVtIGdyb3d0aHMgZm9yIGNvbnN1bWVycywgYW5kIGluY3JlYXNlcyBpbiBmZWRlcmFsIHNwZW5kaW5nLiBUaGUgZXhwYW5zaW9uIG9mIGhlYWx0aCBpbnN1cmFuY2UgYW5kIGhlYWx0aGNhcmUgY292ZXJhZ2UgaXMgcHJvamVjdGVkIHRvIGNvc3Qgb2YgdGhlIFUuUy4gZ292ZXJubWVudCB1cCB0byAkMS4zNCB0cmlsbGlvbiBvdmVyIHRoZSBuZXh0IGRlY2FkZS4gSXQgaXMgdGh1cyBubyBzdXJwcmlzZSB0aGF0IHRoZSBTdGF0ZXMgZmFsbCBvbiB2YXJpb3VzIHNpZGVzIG9mIHRoZSBwb2xpdGljYWwgc3BlY3RydW0gd2hlbiBpdCBjb21lcyB0byBzdXBwb3J0IGZvciBtZWRpY2FpZC4KCgotLS0tLQoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHRpZHk9VFJVRX0Kcm0obGlzdD1scygpKQoKbGlicmFyeShsZWFmbGV0KQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkocmdkYWwpCmxpYnJhcnkoRFQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShwbG90bHkpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoc3RyaW5naSkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoY291bnRyeWNvZGUpCnJlcXVpcmUoZ3JpZEV4dHJhKQpgYGAKCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyMgSU1QT1JUIERBVEEKCiMgR2VuZXJhbCBBQ0EgaW5mb3JtYXRpb24KYWNhX2dlbmVyYWxfcmF3IDwtIHJlYWRfZXhjZWwoIkRhdGEvc3RhdGVzX2FjYV9nZW5lcmFsLnhsc3giLCBzaGVldD0yLCBjb2xfbmFtZXM9RkFMU0UpCgojIFN0YXRlcyBoZWFsdGggb3V0Y29tZXMKaGVhbHRoX2luZF9yYXcgPC0gcmVhZF9leGNlbCgiRGF0YS9zdGF0ZXNfaGVhbHRoX2luZC54bHN4Iiwgc2hlZXQ9NCwgY29sX25hbWVzPUZBTFNFKQoKIyBJbnN1cmFuY2UgY292ZXJhZ2UgZGF0YQogICMgTG9uZyBmb3JtYXQKaW5zdXJhbmNlX2xvbmcgPC0gcmVhZF9leGNlbCgiRGF0YS9pbnN1cmFuY2UtY2xlYW4ueGxzeCIsIHNoZWV0PTEsIGNvbF9uYW1lcz1UUlVFKQogICMgV2lkZSBmb3JtYXQKaW5zdXJhbmNlIDwtIHJlYWRfZXhjZWwoIkRhdGEvaW5zdXJhbmNlLWNsZWFuLnhsc3giLCBzaGVldD0yLCBjb2xfbmFtZXM9VFJVRSkKCiMgRGVtb2dyYXBoaWMgaW5mb3JtYXRpb24KZGVtb2dyYXBoaWNzMSA8LSByZWFkLmNzdigiRGF0YS9Qb3B1bGF0aW9uX0FnZV9JbmNvbWUuY3N2IiwgaGVhZGVyID0gVFJVRSkKICAjIFByb3ZpZGVkIHdpdGggQXNzaWdubWVudCA0ICh3YW50IHRoZSB5ZWFybHkgcG9wdWxhdGlvbiBkYXRhKQpkZW1vZ3JhcGhpY3MyIDwtIHJlYWRfZXhjZWwoIkRhdGEvUG9wdWxhdGlvbkVzdGltYXRlcy54bHMiKQoKIyBFbGVjdGlvbiBSZXN1bHRzCmVsZWN0aW9uIDwtIHJlYWRfZXhjZWwoIkRhdGEvVVNfUHJlc2lkZW50aWFsX1Jlc3VsdHNfYnlfU3RhdGVfMTgyOC0yMDE2Lnhsc3giLCBzaGVldD0yLCBjb2xfbmFtZXM9RkFMU0UpCmBgYAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIENMRUFOIERBVEEKCiMgTGlzdCBvZiBzdGF0ZXMgYWJicmV2aWF0aW9ucwpzdGF0ZV9hYmJyZXZpYXRpb25zIDwtIGMoIkFMIiwgIkFLIiwgIkFaIiwgIkFSIiwgIkNBIiwgIkNPIiwgIkNUIiwgIkRFIiwgIkZMIiwgIkdBIiwgIkhJIiwgIklEIiwgIklMIiwgIklOIiwgIklBIiwgIktTIiwgIktZIiwgIkxBIiwgIk1FIiwgIk1EIiwgIk1BIiwgIk1JIiwgIk1OIiwgIk1TIiwgIk1PIiwgIk1UIiwgIk5FIiwgIk5WIiwgIk5IIiwgIk5KIiwgIk5NIiwgIk5ZIiwgIk5DIiwgIk5EIiwgIk9IIiwgIk9LIiwgIk9SIiwgIlBBIiwgIlJJIiwgIlNDIiwgIlNEIiwgIlROIiwgIlRYIiwgIlVUIiwgIlZUIiwgIlZBIiwgIldBIiwgIldWIiwgIldJIiwgIldZIikKCgojIyBDTEVBTiBJTlNVUkFOQ0UgUkFURVMgREFUQSAoV0lERSkKCiMgRHJvcCB1bm5lY2Vzc2FyeSBjb2x1bW5zCmluc3VyYW5jZSA8LSBpbnN1cmFuY2VbMTo1MCwgLTFdCgojIFJlbmFtZSB2YXJpYWJsZXMKY29sbmFtZXMoaW5zdXJhbmNlKSA8LSBjKCJzdGF0ZV9hYmIiLCAic3RhdGUiLCAidW5pbnN1cmVkX251bV8yMDA4IiwgInVuaW5zdXJlZF9wY3RfMjAwOCIsICJ1bmluc3VyZWRfbnVtXzIwMDkiLCAidW5pbnN1cmVkX3BjdF8yMDA5IiwgInVuaW5zdXJlZF9udW1fMjAxMCIsICJ1bmluc3VyZWRfcGN0XzIwMTAiLCAidW5pbnN1cmVkX251bV8yMDExIiwgInVuaW5zdXJlZF9wY3RfMjAxMSIsICJ1bmluc3VyZWRfbnVtXzIwMTIiLCAidW5pbnN1cmVkX3BjdF8yMDEyIiwgInVuaW5zdXJlZF9udW1fMjAxMyIsICJ1bmluc3VyZWRfcGN0XzIwMTMiLCAidW5pbnN1cmVkX251bV8yMDE0IiwgInVuaW5zdXJlZF9wY3RfMjAxNCIsICJ1bmluc3VyZWRfbnVtXzIwMTUiLCAidW5pbnN1cmVkX3BjdF8yMDE1IikKCiMgQ3JlYXRlIHZhcmlhYmxlcyBmb3IgaW5zdXJhbmNlIHJhdGVzCmluc3VyYW5jZSRpbnN1cmVkX3BjdF8yMDA4IDwtIDEwMCAtIGluc3VyYW5jZSR1bmluc3VyZWRfcGN0XzIwMDgKaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMDkgPC0gMTAwIC0gaW5zdXJhbmNlJHVuaW5zdXJlZF9wY3RfMjAwOQppbnN1cmFuY2UkaW5zdXJlZF9wY3RfMjAxMCA8LSAxMDAgLSBpbnN1cmFuY2UkdW5pbnN1cmVkX3BjdF8yMDEwCmluc3VyYW5jZSRpbnN1cmVkX3BjdF8yMDExIDwtIDEwMCAtIGluc3VyYW5jZSR1bmluc3VyZWRfcGN0XzIwMTEKaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMTIgPC0gMTAwIC0gaW5zdXJhbmNlJHVuaW5zdXJlZF9wY3RfMjAxMgppbnN1cmFuY2UkaW5zdXJlZF9wY3RfMjAxMyA8LSAxMDAgLSBpbnN1cmFuY2UkdW5pbnN1cmVkX3BjdF8yMDEzCmluc3VyYW5jZSRpbnN1cmVkX3BjdF8yMDE0IDwtIDEwMCAtIGluc3VyYW5jZSR1bmluc3VyZWRfcGN0XzIwMTQKaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMTUgPC0gMTAwIC0gaW5zdXJhbmNlJHVuaW5zdXJlZF9wY3RfMjAxNQoKIyBSZW9yZGVyIHZhcmlhYmxlcwppbnN1cmFuY2UgPC0gaW5zdXJhbmNlWyAsIGMoInN0YXRlX2FiYiIsICJzdGF0ZSIsICJ1bmluc3VyZWRfbnVtXzIwMDgiLCAidW5pbnN1cmVkX3BjdF8yMDA4IiwgImluc3VyZWRfcGN0XzIwMDgiLCAidW5pbnN1cmVkX251bV8yMDA5IiwgInVuaW5zdXJlZF9wY3RfMjAwOSIsICJpbnN1cmVkX3BjdF8yMDA5IiwgInVuaW5zdXJlZF9udW1fMjAxMCIsICJ1bmluc3VyZWRfcGN0XzIwMTAiLCAiaW5zdXJlZF9wY3RfMjAxMCIsICJ1bmluc3VyZWRfbnVtXzIwMTEiLCAidW5pbnN1cmVkX3BjdF8yMDExIiwgImluc3VyZWRfcGN0XzIwMTEiLCAidW5pbnN1cmVkX251bV8yMDEyIiwgInVuaW5zdXJlZF9wY3RfMjAxMiIsICJpbnN1cmVkX3BjdF8yMDEyIiwgInVuaW5zdXJlZF9udW1fMjAxMyIsICJ1bmluc3VyZWRfcGN0XzIwMTMiLCAiaW5zdXJlZF9wY3RfMjAxMyIsICJ1bmluc3VyZWRfbnVtXzIwMTQiLCAidW5pbnN1cmVkX3BjdF8yMDE0IiwgImluc3VyZWRfcGN0XzIwMTQiLCAidW5pbnN1cmVkX251bV8yMDE1IiwgInVuaW5zdXJlZF9wY3RfMjAxNSIsICJpbnN1cmVkX3BjdF8yMDE1IildCgoKIyMgQ0xFQU4gSU5TVVJBTkNFIFJBVEVTIERBVEEgKExPTkcpCgojIFJlbmFtZSB2YXJpYWJsZXMKY29sbmFtZXMoaW5zdXJhbmNlX2xvbmcpIDwtIGMoInllYXIiLCAic3RhdGUiLCAicG9wdWxhdGlvbiIsICJ1bmluc3VyZWRfbnVtIiwgInVuaW5zdXJlZF9wY3QiLCAiaW5zdXJlZF9udW0iLCAiaW5zdXJlZF9wY3QiKQoKIyBBZGQgc3RhdGUgYWJicmV2aWF0aW9ucwogICMgRmlyc3QgY3JlYXRlIGEgbG9vay11cCB0YWJsZSAoYmFzZWQgb24gd2lkZSBkYXRhKQpzdGF0ZV9hYmJfbG9va3VwIDwtIGluc3VyYW5jZVsgLCBjKCJzdGF0ZSIsICJzdGF0ZV9hYmIiKV0KICAjIFRoZW4gZG8gdGhlIG1hdGNoaW5nCmluc3VyYW5jZV9sb25nJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJfbG9va3VwJHN0YXRlX2FiYlttYXRjaChpbnN1cmFuY2VfbG9uZyRzdGF0ZSwgc3RhdGVfYWJiX2xvb2t1cCRzdGF0ZSldCiAgIyBSZW9yZGVyIHZhcmlhYmxlCmluc3VyYW5jZV9sb25nIDwtIGluc3VyYW5jZV9sb25nWyAsIGMoMToyLCBuY29sKGluc3VyYW5jZV9sb25nKSwgMzoobmNvbChpbnN1cmFuY2VfbG9uZyktMSkpXQoKIyBPcmRlciBvYnNlcnZhdGlvbnMgKGJ5IHN0YXRlLCB0aGVuIGJ5IHllYXIpCmluc3VyYW5jZV9sb25nIDwtIGluc3VyYW5jZV9sb25nW29yZGVyKGluc3VyYW5jZV9sb25nJHN0YXRlLCBpbnN1cmFuY2VfbG9uZyR5ZWFyKSwgXQoKCiMjIENMRUFOIEFDQSBHRU5FUkFMIERBVEEKCiMgS2VlcCBvbmx5IHJlbGV2YW50IHJvd3MgYW5kIGNvbHVtbnMKYWNhX2dlbmVyYWwgPC0gYWNhX2dlbmVyYWxfcmF3WzY6NTcsIDE6NzNdCgojIExhYmVsIHZhcmlhYmxlcyBmb3IgQUNBIGdlbmVyYWwgZGF0YQpuYW1lcyhhY2FfZ2VuZXJhbCkgPC0gYygic3RhdGUiLCAidW5pbnNfYWxsX3BjdF8xMCIsICJ1bmluc19hbGxfcGN0XzE1IiwgInVuaW5zX2FsbF9kZWNyX3BjdCIsICJ1bmluc19hbGxfZGVjciIsICJjb3ZfZW1wIiwgImNvdl9wYXJlbnRzX3BsYW4iLCAibGlmZXRpbWVfbGltX3ByZUFDQV90b3QiLCAibGlmZXRpbWVfbGltX3ByZUFDQV9jaGlsZCIsICJsaWZldGltZV9saW1fcHJlQUNBX2FkdWx0TSIsICJsaWZldGltZV9saW1fcHJlQUNBX2FkdWx0RiIsICJjb3ZfcHJpdmF0ZV90b3QiLCAiY292X3ByaXZhdGVfY2hpbGQiLCAiY292X3ByaXZhdGVfYWR1bHRNIiwgImNvdl9wcml2YXRlX2FkdWx0RiIsICJwcmVtaXVtX2VtcF9hdmdfZ3Jvd3RoX3BjdF8wMHRvMTAiLCAicHJlbWl1bV9lbXBfYXZnX2dyb3d0aF9wY3RfMTB0bzE1IiwgInByZW1pdW1fZW1wX3NhdmluZ3NfMTUiLCAicHJlbWl1bV9lbXBfc2F2aW5nc18xNiIsICJNTFJfcmViYXRlX2JlbmVmaWNpYXJpZXNfMTIiLCAiTUxSX3JlYmF0ZV9hbXRfMTIiLCAiTUxSX3JlYmF0ZV9iZW5lZmljaWFyaWVzXzEzIiwgIk1MUl9yZWJhdGVfYW10XzEzIiwgIk1MUl9yZWJhdGVfYmVuZWZpY2lhcmllc18xNCIsICJNTFJfcmViYXRlX2FtdF8xNCIsICJNTFJfcmViYXRlX2JlbmVmaWNpYXJpZXNfMTUiLCAiTUxSX3JlYmF0ZV9hbXRfMTUiLCAiTUxSX3JlYmF0ZV9hbXRfMTJ0bzE1IiwgIm1lZGljYWlkX2Vucm9sbF8xMyIsICJtZWRpY2FpZF9lbnJvbGxfMTYiLCAibWVkaWNhaWRfZW5yb2xsX2NoaWxkXzEzIiwgIm1lZGljYWlkX2Vucm9sbF9pbmNyXzEzdG8xNiIsICJtZWRpY2FpZF9mdWxsX2R1YWxzIiwgIm1lZGljYWlkX3BhcnRpYWxfZHVhbHMiLCAibWVkaWNhaWRfZnVsbF9vcl9wYXJ0aWFsX2R1YWxzIiwgInN0YXRlX2hhc19leHBhbmRlZCIsICJpbnN1cmFuY2VfaW5jcl9tZWRpY2FpZCIsICJjaG9sZXN0X3Njcl9pbmNyX21lZGljYWlkIiwgIm1hbW1vZ3JhbV9pbmNyX21lZGljYWlkIiwgInBhcHNtZWFyX2luY3JfbWVkaWNhaWQiLCAiY2xpbmljX2NhcmVfaW5jcl9tZWRpY2FpZCIsICJhbGxfY2FyZV9pbmNyX21lZGljYWlkIiwgInBoeWNpc2lhbl92aXNpdF9hbm5faW5jcl9tZWRpY2FpZCIsICJkZXByZXNzaW9uX2RlY3JfbWVkaWNhaWQiLCAiZ29vZF9oZWFsdGhfaW5jcl9tZWRpY2FpZCIsICJkZWF0aHNfYW5uX2RlY3JfbWVkaWNhaWQiLCAiY2F0YXN0cm9waGljX29vcF9hbm5fZGVjcl9tZWRpY2FpZCIsICJpbmRlYnRlZF9wcGxfZGVjcl9tZWRpY2FpZCIsICJmZWRfc3BlbmRpbmdfbmV0X2luY3JfaW5NaWwiLCAidW5jb21wZW5zYXRlZF9jYXJlX2RlY3JfaW5NaWwiLCAibWVudGFsX3N1YnN0YW5jZV9lbGlnX21lZGljYWlkX3NoYXJlIiwgIm1lbnRhbF9zdWJzdGFuY2VfZWxpZ19tZWRpY2FpZCIsICJwcmVleGlzdGluZ19jb25kaXRpb25fMDkiLCAiY292X21rdF9wbGFuXzE2IiwgImNvdl9ta3RfMTYiLCAicmVjZWl2ZV90YXhfY3JlZGl0IiwgImF2Z190YXhfY3JlZGl0IiwgInJlY2VpdmVfY29zdF9zaGFyaW5nIiwgImF2Z19udW1fbWt0X3BsYW5zX2F2YWlsXzE3IiwgImNvdl9ta3RfdW5kZXI3NURfcGN0IiwgImNvdl9ta3RfdW5kZXIxMDBEX3BjdCIsICJjb3Zfb2ZmbWt0X2VsaWdfdGF4X2NyZWRpdCIsICJyYXRlX3Jldmlld19mdW5kc190b19zdGF0ZSIsICJISUVDUF9ncmFudF9hd2FyZF90b19zdGF0ZSIsICJtZWRpY2FyZV9lbnJvbGxfMTYiLCAibWVkaWNhcmVfYmVuZWZfZG9udXRob2xlIiwgIm1lZGljYXJlX2JlbmVmX2RvbnV0aG9sZV9zYXZpbmdzX3RvdCIsICJtZWRpY2FyZV9iZW5lZl9kb251dGhvbGVfc2F2aW5nc19hdmciLCAibWVkaWNhcmVfcGFydEJfZnJlZV9wcmV2X3NlcnZpY2VzIiwgIm1lZGljYXJlX3BhcnRCX2ZyZWVfcHJldl9zZXJ2aWNlc19zaGFyZSIsICJtZWRpY2FyZV9pbmNyX3JlYWRtaXRfcmF0ZSIsICJtZWRpY2FyZV9hdm9pZGVkX3JlYWRtaXQiLCAiYWNjb3VudGFibGVfY2FyZV9vcmdfbnVtIikKCiMgVHJpbSB3aGl0ZSBzcGFjZSBvbiBzdGF0ZSB2YXJpYWJsZQphY2FfZ2VuZXJhbCRzdGF0ZSA8LSBzdHJpX3RyaW1fYm90aChhY2FfZ2VuZXJhbCRzdGF0ZSkKCiMgQ2hhbmdlIGZvcm1hdCBvZiB2YXJpYWJsZXMKICAjIEFwYXJ0IGZyb20gVC9GIHZhcmlhYmxlIGZvciAic3RhdGUgaGFzIGV4cGFuZGVkIgphY2FfZ2VuZXJhbCRzdGF0ZV9oYXNfZXhwYW5kZWRbYWNhX2dlbmVyYWwkc3RhdGVfaGFzX2V4cGFuZGVkPT0ieWVzIl0gPC0gVFJVRSAKYWNhX2dlbmVyYWwkc3RhdGVfaGFzX2V4cGFuZGVkW2FjYV9nZW5lcmFsJHN0YXRlX2hhc19leHBhbmRlZD09Im5vIl0gPC0gRkFMU0UgCiAgIyBDb252ZXJ0IG90aGVycyB0byBudW1lcmljIGZvcm0KZm9yIChqIGluIGMoMjozNSwgMzc6NzMpKSB7CiAgYWNhX2dlbmVyYWxbW2pdXSA8LSBhcy5udW1lcmljKGFjYV9nZW5lcmFsW1tqXV0pCn0KCiMgU2F2ZSBVU0EgZGF0YSBzZXBhcmF0ZWx5CmFjYV9nZW5lcmFsX1VTQSA8LSBhY2FfZ2VuZXJhbFthY2FfZ2VuZXJhbCRzdGF0ZT09IlVuaXRlZCBTdGF0ZXMiLCBdCgojIERyb3AgVVNBIGFuZCBEQyBkYXRhCmFjYV9nZW5lcmFsIDwtIGFjYV9nZW5lcmFsWyEoYWNhX2dlbmVyYWwkc3RhdGUgJWluJSBjKCJVbml0ZWQgU3RhdGVzIiwgIkRpc3RyaWN0IG9mIENvbHVtYmlhIikpLCBdCgojIEFkZCBzdGF0ZSBhYmJyZXZpYXRpb25zCmFjYV9nZW5lcmFsJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJyZXZpYXRpb25zCmFjYV9nZW5lcmFsIDwtIGFjYV9nZW5lcmFsWyAsIGMoMSwgbmNvbChhY2FfZ2VuZXJhbCksIDI6KG5jb2woYWNhX2dlbmVyYWwpLTEpKV0KCiMgRHJvcCByYXcgZGF0YQpybShhY2FfZ2VuZXJhbF9yYXcpCgoKIyMgQ0xFQU4gSEVBTFRIIElORElDQVRPUiBEQVRBCgojIEtlZXAgb25seSByZWxldmFudCByb3dzIGFuZCBjb2x1bW5zCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZF9yYXdbNDo2NzAzLCBjKDEsIDM6NildCgojIExhYmVsIHZhcmlhYmxlcwpuYW1lcyhoZWFsdGhfaW5kKSA8LSBjKCJzdGF0ZSIsICJtZWFzdXJlIiwgInllYXIiLCAicmF0ZSIsICJyYW5rIikKCiMgU2ltcGxpZnkgZGF0ZSAoeWVhcnMpIC0gb25seSBrZWVwIGxhc3QgeWVhciBpZiByYW5nZSB3YXMgZ2l2ZW4KaGVhbHRoX2luZCR5ZWFyW2hlYWx0aF9pbmQkeWVhcj09IjA3LzIwMDkgLSAwNi8yMDEyIl0gPC0gIjIwMTIiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIwNy8yMDEwIC0gMDYvMjAxMyJdIDwtICIyMDEzIgpoZWFsdGhfaW5kJHllYXJbaGVhbHRoX2luZCR5ZWFyPT0iMDcvMjAxMiAtIDA2LzIwMTUiXSA8LSAiMjAxNSIKaGVhbHRoX2luZCR5ZWFyW2hlYWx0aF9pbmQkeWVhcj09IjEwLzIwMTMtOS8yMDE0Il0gPC0gIjIwMTQiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDA4LTA5Il0gPC0gIjIwMDkiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEwLTExIl0gPC0gIjIwMTEiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDExLTEyIl0gPC0gIjIwMTIiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDExLzEyIl0gPC0gIjIwMTIiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEyLTEzIl0gPC0gIjIwMTMiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEzLTE0Il0gPC0gIjIwMTQiCmhlYWx0aF9pbmQkeWVhcltoZWFsdGhfaW5kJHllYXI9PSIyMDEzKFEyLVE0KSJdIDwtICIyMDEzIgpoZWFsdGhfaW5kJHllYXJbaGVhbHRoX2luZCR5ZWFyPT0iMjAxNC0xNSJdIDwtICIyMDE1IgpoZWFsdGhfaW5kJHllYXJbaGVhbHRoX2luZCR5ZWFyPT0iMjAxNShRMi1RNCkiXSA8LSAiMjAxNSIKCiMgRXhwb3J0IHRvIGV4Y2VsIHRvIG1hbnVhbGx5IGxhYmVsIHZhcmlhYmxlIG5hbWVzCnVuaXF1ZV9tZWFzdXJlcyA8LSB1bmlxdWUoYXMuZmFjdG9yKGhlYWx0aF9pbmQkbWVhc3VyZSkpCiAgIyBDb3BpZWQgaW4gZnJvbSBleGNlbCBzaGVldAp1bmlxdWVfbWVhc3VyZXNfcmVsYWJlbGxlZCA8LSBjKCJhLnN1bW1hcnlfYWNjZXNzIiwgImEudW5pbnNfYWR1bHQiLCAiYS51bmluc19jaGlsZCIsICJhLm5vX2NhcmVfYmNfY29zdF9hZHVsdCIsICJhLmhpZ2hfT09QX3JlbGF0aXZlX3VuZGVyNjUiLCAiYS5hdF9yaXNrX25vX3JvdXRpbmVfZG9jX2FkdWx0IiwgImEubm9fZGVudGFsX2FkdWx0IiwgInEuc3VtbWFyeV9wcmV2X3RyZWF0IiwgInEud2l0aF91c3VhbF9jYXJlX2FkdWx0IiwgInEud2l0aF9jYW5jZXJfc2NyZWVuaW5nX2FkdWx0IiwgInEud2l0aF92YWNjaW5lc19hZHVsdCIsICJxLndpdGhfbWVkaWNhbF9ob21lX2NoaWxkIiwgInEud2l0aF9wcmV2X21lZGljYWxfZGVudGFsX2NoaWxkIiwgInEud2l0aF9tZW50YWxfaGVhbHRoY2FyZV9jaGlsZCIsICJxLndpdGhfdmFjY2luZXNfaW5mYW50IiwgInEuZHJ1Z19zaG91bGRfYXZvaWRfbWVkaWNhcmUiLCAicS5kcnVnX3Nob3VsZF9hdm9pZF8zY29uZGl0aW9uc19tZWRpY2FyZSIsICJxLmdvb2RfaGVhbHRoX3Byb3ZpZGVyX21lZGljYXJlIiwgInEubW9ydGFsaXR5XzRjb25kaXRpb25zX21lZGljYXJlIiwgInEuQ0xBQlNJX2luZmVjdGlvbl9yYXRpbyIsICJxLmluZm9fcmVjb3ZlcnlfaG9zcGl0YWxpemVkIiwgInEuZ29vZF9ob3NwaXRhbF9zdGFmZl9ob3NwaXRhbGl6ZWQiLCAicS5pbXByb3ZlX21vYmlsaXR5X2hvbWVoZWFsdGgiLCAicS5pbXByb3ZlZF93b3VuZHNfaG9tZWhlYWx0aCIsICJxLnNvcmVzX05IcmVzIiwgInEuYW50aXBzeWNob3RpY19tZWRfTkhyZXMiLCAidS5zdW1tYXJ5X2F2b2lkYWJsZV9ob3NwX2Nvc3QiLCAidS5ob3NwX2FzdGhtYV9jaGlsZCIsICJ1Lmhvc3BfYW1idWxhdG9yeV82NXRvNzR5cnMiLCAidS5ob3NwX2FtYnVsYXRvcnlfYWJvdmU3NXlycyIsICJ1LjMwZGF5X2hvc3BfcmVhZG1pdF9tZWRpY2FyZSIsICJ1LjMwZGF5X2hvc3BfcmVhZG1pdF9OSHJlcyIsICJ1Lmhvc3BfNm1vc19OSHJlcyIsICJ1Lmhvc3BfbWVkaWNhcmVfaG9tZWhlYWx0aCIsICJ1LmF2b2lkYWJsZV9FUl9tZWRpY2FyZSIsICJ1LnRvdF9yZWltYl9lbXBsb3llcl9pbnMiLCAidS50b3RfcmVpbWJfbWVkaWNhcmUiLCAiaC5zdW1tYXJ5X2hlYWx0aHlfbGl2ZXMiLCAiaC5kZWF0aHNfYW1lbmFibGUiLCAiaC55cnNfbG9zdF9wb3RlbnRpYWxfbGlmZV9iZWZvcmU3NSIsICJoLmRlYXRoc19icmVhc3RfY2FuY2VyX0YiLCAiaC5kZWF0aHNfY29sb3JlY3RhbF9jYW5jZXIiLCAiaC5kZWF0aHNfc3VpY2lkZSIsICJoLmRlYXRoc19pbmZhbnRfbW9ydGFsaXR5IiwgImgucG9vcl9oZWFsdGhfYWR1bHQiLCAiaC5zbW9rZV9hZHVsdCIsICJoLm9iZXNlX2FkdWx0IiwgImgub2Jlc2VfY2hpbGQiLCAiaC5wb29yX2RlbnRhbF9hZHVsdCIsICJ1LnByZW1pdW1fZW1wX3ByaXZhdGUiLCAidS5wcmVtaXVtX2VtcF9wcml2YXRlX3VuYWRqIiwgInUucmVpbWJfbWVkaWNhcmVfdW5hZGoiLCAidS5kZWF0aHNfYW1lbmFibGVfYmxhY2siLCAidS5kZWF0aHNfYW1lbmFibGVfd2hpdGUiLCBOQSwgInEud2l0aF9wcmV2X3NjcmVlbmluZ19hYm92ZTUweXJzIiwgTkEpCgojIFJlcGxhY2UgdmFyaWFibGUgbmFtZXMgd2l0aCBhYmJyZXZpYXRlZCB2ZXJzaW9uCmZvciAoaSBpbiAxOjU3KSB7CiAgaGVhbHRoX2luZCRtZWFzdXJlIDwtIHJlcGxhY2UoaGVhbHRoX2luZCRtZWFzdXJlLCBoZWFsdGhfaW5kJG1lYXN1cmU9PXVuaXF1ZV9tZWFzdXJlc1tpXSwgdW5pcXVlX21lYXN1cmVzX3JlbGFiZWxsZWRbaV0pCn0KCiMgUmVtb3ZlIHRoZSBOQSdzCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZFshaXMubmEoaGVhbHRoX2luZCRtZWFzdXJlKSwgXQoKIyBSZW1vdmUgZHVwbGljYXRlcwogICMgQnkgc3RhdGUsIG1lYXN1cmUueWVhcgpoZWFsdGhfaW5kIDwtIGhlYWx0aF9pbmRbIWR1cGxpY2F0ZWQoaGVhbHRoX2luZFsgLCAxOjNdKSwgXQoKIyBJbnRlcmFjdCBtZWFzdXJlIGFuZCB5ZWFyCmhlYWx0aF9pbmQkbWVhc3VyZV95ZWFyIDwtIGludGVyYWN0aW9uKGhlYWx0aF9pbmQkbWVhc3VyZSwgaGVhbHRoX2luZCR5ZWFyKQoKIyBDb252ZXJ0IHRvIGNoYXJhY3RlciB2YXJpYWJsZQpoZWFsdGhfaW5kJG1lYXN1cmVfeWVhciA8LSBhcy5jaGFyYWN0ZXIoaGVhbHRoX2luZCRtZWFzdXJlX3llYXIpCgojIFByZS1yZXNoYXBlOiBTdG9yZSBleGlzdGluZyBkYXRhIGFzICJsb25nIgpoZWFsdGhfaW5kX2xvbmcgPC0gaGVhbHRoX2luZAoKIyBSZXNoYXBlIHdpZGUKaGVhbHRoX2luZCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGhlYWx0aF9pbmQkc3RhdGUsIGhlYWx0aF9pbmQkbWVhc3VyZV95ZWFyLCBoZWFsdGhfaW5kJHJhdGUpKQogICMgRHJvcCByYW5rIGRhdGEgZm9yIG5vdwpuYW1lcyhoZWFsdGhfaW5kKSA8LSBjKCJzdGF0ZSIsICJtZWFzdXJlX3llYXIiLCAicmF0ZSIpCmhlYWx0aF9pbmQgPC0gcmVzaGFwZShoZWFsdGhfaW5kLAogICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJzdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAibWVhc3VyZV95ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQoKIyBEcm9wICJyYXRlIiBmcm9tIHRoZSBuYW1lCm5hbWVzKGhlYWx0aF9pbmQpWzI6bmNvbChoZWFsdGhfaW5kKV0gPC0gc3Vic3RyKG5hbWVzKGhlYWx0aF9pbmQpLCA2LCBuY2hhcihuYW1lcyhoZWFsdGhfaW5kKSkpWzI6bmNvbChoZWFsdGhfaW5kKV0KCiMgRHJvcCB2YXJpYWJsZXMgd2hvIGhhdmUgYWxsIGVudHJpZXMgYXMgTkEKICAjIER1ZSB0byAndW5iYWxhbmNlZCBwYW5lbCcgaW4gcmVzaGFwaW5nCiAgIyBGaXJzdCBjcmVhdGUgYSB2ZWN0b3IgdG8gcmVjb3JkIGlmIHZhcmlhYmxlIGlzIGFsbCBOQQp2YXJpYWJsZV9hbGxfTkEgPC0gdmVjdG9yKG1vZGU9ImxvZ2ljYWwiLCBsZW5ndGg9bmNvbChoZWFsdGhfaW5kKSkKZm9yIChqIGluIDE6bmNvbChoZWFsdGhfaW5kKSkgewogIGlmKHN1bShpcy5uYShoZWFsdGhfaW5kW1tqXV0pKT09NTIpIHsKICAgIHZhcmlhYmxlX2FsbF9OQVtqXSA8LSBUUlVFCiAgfQp9CiAgIyBPbmx5IGtlZXAgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBOT1QgYWxsIE5BCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZFsgLCAhdmFyaWFibGVfYWxsX05BXQoKIyBDaGFuZ2UgZm9ybWF0IG9mIHZhcmlhYmxlcwogICMgVG8gY2hhcmFjdGVyIHZhcmlhYmxlCmhlYWx0aF9pbmQkc3RhdGUgPC0gYXMuY2hhcmFjdGVyKGhlYWx0aF9pbmQkc3RhdGUpCiAgIyBUbyBudW1lcmljIHZhcmlhYmxlCmZvciAoaiBpbiBjKDI6MTY0KSkgewogIGhlYWx0aF9pbmRbW2pdXSA8LSBhcy5jaGFyYWN0ZXIoaGVhbHRoX2luZFtbal1dKQogIGhlYWx0aF9pbmRbW2pdXSA8LSBhcy5udW1lcmljKGhlYWx0aF9pbmRbW2pdXSkKfQoKIyBTYXZlIFVTQSBkYXRhIHNlcGFyYXRlbHkKaGVhbHRoX2luZF9VU0EgPC0gaGVhbHRoX2luZFtoZWFsdGhfaW5kJHN0YXRlPT0iVW5pdGVkIFN0YXRlcyIsIF0KCiMgRHJvcCBVU0EgYW5kIERDIGRhdGEKaGVhbHRoX2luZCA8LSBoZWFsdGhfaW5kWyEoaGVhbHRoX2luZCRzdGF0ZSAlaW4lIGMoIlVuaXRlZCBTdGF0ZXMiLCAiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiKSksIF0KCiMgTGFiZWwgc3RhdGUgYWJicmV2aWF0aW9ucwpoZWFsdGhfaW5kJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJyZXZpYXRpb25zCmhlYWx0aF9pbmQgPC0gaGVhbHRoX2luZFsgLCBjKDEsIG5jb2woaGVhbHRoX2luZCksIDI6KG5jb2woaGVhbHRoX2luZCktMSkpXQoKIyBEcm9wIHJhdyBkYXRhCnJtKGhlYWx0aF9pbmRfcmF3KQoKCiMjIENMRUFOIERFTU9HUkFQSElDICgxKSBEQVRBCgojIERyb3AgdW5uZWNlc3Nhcnkgcm93IGFuZCBjb2x1bW4KZGVtb2dyYXBoaWNzMSA8LSBkZW1vZ3JhcGhpY3MxWy0xLC0xXQoKIyBSZW5hbWUgdmFyaWFibGVzCmNvbG5hbWVzKGRlbW9ncmFwaGljczEpIDwtIGMoInN0YXRlIiwiaW5jb21lIiwicG9wdWxhdGlvbiIsICJwcGxfYWdlMHRvNCIsInBwbF9hZ2U1dG85IiwicHBsX2FnZTEwdG8xNCIsInBwbF9hZ2UxNXRvMTkiLCJwcGxfYWdlMjB0bzI0IiwgInBwbF9hZ2UyNXRvMjkiLCJwcGxfYWdlMzB0bzM0IiwicHBsX2FnZTM1dG8zOSIsInBwbF9hZ2U0MHRvNDQiLCAicHBsX2FnZTQ1dG80OSIsInBwbF9hZ2U1MHRvNTQiLCJwcGxfYWdlNTV0bzU5IiwicHBsX2FnZTYwdG82NCIsICJwcGxfYWdlNjV0bzY5IiwicHBsX2FnZTcwdG83NCIsInBwbF9hZ2U3NXRvNzkiLCJwcGxfYWdlODB0bzg0IiwicHBsX2FnZTg1cGx1cyIpCgojIERyb3Agb2JzZXJ2YXRpb25zIERDIGFuZCBQUgpkZW1vZ3JhcGhpY3MxIDwtIGRlbW9ncmFwaGljczFbIWRlbW9ncmFwaGljczEkc3RhdGU9PSJEaXN0cmljdCBvZiBDb2x1bWJpYSIgJiAhZGVtb2dyYXBoaWNzMSRzdGF0ZT09IlB1ZXJ0byBSaWNvIiwgXQoKIyBMYWJlbCBzdGF0ZSBhYmJyZXZpYXRpb25zCmRlbW9ncmFwaGljczEkc3RhdGVfYWJiIDwtIHN0YXRlX2FiYnJldmlhdGlvbnMKZGVtb2dyYXBoaWNzMSA8LSBkZW1vZ3JhcGhpY3MxWyAsIGMoMSwgbmNvbChkZW1vZ3JhcGhpY3MxKSwgMjoobmNvbChkZW1vZ3JhcGhpY3MxKS0xKSldCgojIENoYW5nZSBmb3JtYXQgb2YgdmFyaWFibGVzCiAgIyBUbyBjaGFyYWN0ZXIgdmFyaWFibGUKZGVtb2dyYXBoaWNzMSRzdGF0ZSA8LSBhcy5jaGFyYWN0ZXIoZGVtb2dyYXBoaWNzMSRzdGF0ZSkKICAjIFRvIG51bWVyaWMgdmFyaWFibGUKZm9yIChqIGluIGMoMzpuY29sKGRlbW9ncmFwaGljczEpKSkgewogIGRlbW9ncmFwaGljczFbW2pdXSA8LSBhcy5jaGFyYWN0ZXIoZGVtb2dyYXBoaWNzMVtbal1dKQogIGRlbW9ncmFwaGljczFbW2pdXSA8LSBhcy5udW1lcmljKGRlbW9ncmFwaGljczFbW2pdXSkKfQoKIyBCRUEgcmVnaW9ucwpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb24gPC0gIiIKZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW2RlbW9ncmFwaGljczEkc3RhdGVfYWJiICVpbiUgYygiTUUiLCAiTkgiLCAiVlQiLCAiTUEiLCAiQ1QiLCAiUkkiKV0gPC0gIk5ldyBFbmdsYW5kIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJOWSIsICJOSiIsICJQQSIsICJNRCIsICJERSIpXSA8LSAiTWlkZWFzdCIKZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW2RlbW9ncmFwaGljczEkc3RhdGVfYWJiICVpbiUgYygiV0kiLCAiSUwiLCAiTUkiLCAiSU4iLCAiT0giKV0gPC0gIkdyZWF0IExha2VzIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJXViIsICJLWSIsICJWQSIsICJUTiIsICJOQyIsICJTQyIsICJBUiIsICJMQSIsICJNUyIsICJBTCIsICJHQSIsICJGTCIpXSA8LSAiU291dGhlYXN0IgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJORCIsICJTRCIsICJORSIsICJLUyIsICJNTiIsICJJQSIsICJNTyIpXSA8LSAiUGxhaW5zIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJNVCIsICJJRCIsICJXWSIsICJVVCIsICJDTyIpXSA8LSAiUm9ja3kgTW91bnRhaW5zIgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJBWiIsICJOTSIsICJUWCIsICJPSyIpXSA8LSAiU291dGh3ZXN0IgpkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bZGVtb2dyYXBoaWNzMSRzdGF0ZV9hYmIgJWluJSBjKCJXQSIsICJPUiIsICJDQSIsICJOViIsICJBSyIsICJISSIpXSA8LSAiRmFyIFdlc3QiCgojIFRhZyBpbmNvbWUgbGV2ZWwgKGNhdGVnb3J5KQpkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbCA8LSAiIgpkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFtkZW1vZ3JhcGhpY3MxJGluY29tZSA+PSA2MDAwMF0gPC0gIkhpZ2giCmRlbW9ncmFwaGljczEkaW5jb21lX2xldmVsW2RlbW9ncmFwaGljczEkaW5jb21lID49IDUwMDAwICYgZGVtb2dyYXBoaWNzMSRpbmNvbWUgPCA2MDAwMF0gPC0gIlVwcGVyIE1pZGRsZSIKZGVtb2dyYXBoaWNzMSRpbmNvbWVfbGV2ZWxbZGVtb2dyYXBoaWNzMSRpbmNvbWUgPj0gNDUwMDAgJiBkZW1vZ3JhcGhpY3MxJGluY29tZSA8IDUwMDAwXSA8LSAiTG93ZXIgTWlkZGxlIgpkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFtkZW1vZ3JhcGhpY3MxJGluY29tZSA8IDQ1MDAwXSA8LSAiTG93IgogICMgQ29udmVydCB0byBmYWN0b3IgdmFyaWFibGUKZGVtb2dyYXBoaWNzMSRpbmNvbWVfbGV2ZWwgPC0gZmFjdG9yKGRlbW9ncmFwaGljczEkaW5jb21lX2xldmVsLCBsZXZlbHMgPSBjKCJMb3ciLCAiTG93ZXIgTWlkZGxlIiwgIlVwcGVyIE1pZGRsZSIsICJIaWdoIikpCgoKIyMgQ0xFQU4gREVNT0dSQVBISUMgKDIpIERBVEEKCmNvbG5hbWVzKGRlbW9ncmFwaGljczIpIDwtIGRlbW9ncmFwaGljczJbMiwgXQoKIyBEcm9wIGZpcnN0IGZldyByb3dzIChub24tb2JzZXJ2YXRpb25zKQpkZW1vZ3JhcGhpY3MyIDwtIGRlbW9ncmFwaGljczJbLSgxOjIpLCBdCgojIERyb3AgY291bnR5LWxldmVsIGRhdGEsICBrZWVwIHN0YXRlLWxldmVsIGRhdGEgb25seQpkZW1vZ3JhcGhpY3MyIDwtIGRlbW9ncmFwaGljczJbZGVtb2dyYXBoaWNzMiRBcmVhX05hbWUgPT0gIlVuaXRlZCBTdGF0ZXMiIHwgZGVtb2dyYXBoaWNzMiRTdGF0ZSAhPSBsYWcoZGVtb2dyYXBoaWNzMiRTdGF0ZSksIF0KCiMgS2VlcCBvbmx5IGNvbHVtbnMgb2YgcG9wdWxhdGlvbiBmcm9tIDIwMTAgdG8gMjAxNQpkZW1vZ3JhcGhpY3MyIDwtIGRlbW9ncmFwaGljczJbICwgYygiU3RhdGUiLCAiQXJlYV9OYW1lIiwgIlBPUF9FU1RJTUFURV8yMDEwIiwgIlBPUF9FU1RJTUFURV8yMDExIiwgIlBPUF9FU1RJTUFURV8yMDEyIiwgIlBPUF9FU1RJTUFURV8yMDEzIiwgIlBPUF9FU1RJTUFURV8yMDE0IiwgIlBPUF9FU1RJTUFURV8yMDE1IildCgojIENoYW5nZSBmb3JtYXQgb2YgdmFyaWFibGVzCiAgIyBUbyBjaGFyYWN0ZXIgdmFyaWFibGUKZm9yIChqIGluIGMoMzo4KSkgewogIGRlbW9ncmFwaGljczJbW2pdXSA8LSBhcy5udW1lcmljKGRlbW9ncmFwaGljczJbW2pdXSkKfQoKIyBSZW5hbWUgdmFyaWFibGVzCmNvbG5hbWVzKGRlbW9ncmFwaGljczIpIDwtIGMoInN0YXRlX2FiYiIsICJzdGF0ZSIsICJwb3B1bGF0aW9uXzIwMTAiLCAicG9wdWxhdGlvbl8yMDExIiwgInBvcHVsYXRpb25fMjAxMiIsICJwb3B1bGF0aW9uXzIwMTMiLCAicG9wdWxhdGlvbl8yMDE0IiwgInBvcHVsYXRpb25fMjAxNSIpCgoKIyMgQ0xFQU4gRUxFQ1RJT04gREFUQQoKIyBLZWVwIG9ubHkgMjAxMiBhbmQgMjAwOCBkYXRhLCBhbmQgZGF0YSBmb3IgdGhlIDUwIHN0YXRlcwplbGVjdGlvbiA8LSBlbGVjdGlvblsgNDo1MyAsIGMoIlgwIiwgIlg1IiwgIlg2IiwgIlg5IiwgIlgxMCIpXQoKIyBSZW5hbWUgdmFyaWFibGVzCmNvbG5hbWVzKGVsZWN0aW9uKSA8LSBjKCJzdGF0ZSIsICJEZW1fcGN0XzIwMTIiLCAiUmVwX3BjdF8yMDEyIiwgIkRlbV9wY3RfMjAwOCIsICJSZXBfcGN0XzIwMDgiKQoKIyBBZGQgc3RhdGUgYWJicmV2aWF0aW9ucwogICMgTWF0Y2ggd2l0aCBsb29rLXVwIHRhYmxlCmVsZWN0aW9uJHN0YXRlX2FiYiA8LSBzdGF0ZV9hYmJfbG9va3VwJHN0YXRlX2FiYlttYXRjaChlbGVjdGlvbiRzdGF0ZSwgc3RhdGVfYWJiX2xvb2t1cCRzdGF0ZSldCgojIENoYW5nZSBmb3JtYXQgb2YgdmFyaWFibGVzCiAgIyBUbyBudW1lcmljIHZhcmlhYmxlCmZvciAoaiBpbiBjKDQ6NikpIHsKICBlbGVjdGlvbltbal1dIDwtIGFzLm51bWVyaWMoZWxlY3Rpb25bW2pdXSkKfQoKIyBDYWxjdWxhdGUgd2lubmluZyBwYXJ0eSBmb3IgZWFjaCBzdGF0ZQplbGVjdGlvbiRwYXJ0eV8yMDEyIDwtIGlmZWxzZShlbGVjdGlvbiREZW1fcGN0XzIwMTIgPiBlbGVjdGlvbiRSZXBfcGN0XzIwMTIsICJEZW1vY3JhdGljIiwgIlJlcHVibGljYW4iKQplbGVjdGlvbiRwYXJ0eV8yMDA4IDwtIGlmZWxzZShlbGVjdGlvbiREZW1fcGN0XzIwMDggPiBlbGVjdGlvbiRSZXBfcGN0XzIwMDgsICJEZW1vY3JhdGljIiwgIlJlcHVibGljYW4iKQoKIyBSZW9yZGVyIHZhcmlhYmxlcwplbGVjdGlvbiA8LSBlbGVjdGlvblsgLCBjKCJzdGF0ZSIsICJzdGF0ZV9hYmIiLCAiRGVtX3BjdF8yMDEyIiwgIlJlcF9wY3RfMjAxMiIsICJwYXJ0eV8yMDEyIiwgIkRlbV9wY3RfMjAwOCIsICJSZXBfcGN0XzIwMDgiLCAicGFydHlfMjAwOCIpXQpgYGAKCgojICgxKSBIZWFsdGggSW5zdXJhbmNlIENvdmVyYWdlCgpfX0ZpZ3VyZSAxX18KCkFjY2VzcyBvdXIgU2hpbnkgQXBwIG9uIFtVbmluc3VyZWQgUmF0ZXMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgZnJvbSAyMDA4LTIwMTVdKGh0dHBzOi8vZ3JhY2Vrb25neXguc2hpbnlhcHBzLmlvL2hlYWx0aF9pbnN1cmFuY2Vfc2hpbnkvKS4KICAgCiAgIAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFNPTUUgREFUQSBQUkVQQVJBVElPTgoKIyBMb29rLXVwIGluZm9ybWF0aW9uIGludG8gaW5zdXJhbmNlIGFuZCBpbnN1cmFuY2VfbG9uZywgb246CiAgIyBQYXJ0eSAoMjAxMikKaW5zdXJhbmNlX2xvbmckcGFydHlfMjAxMiA8LSBlbGVjdGlvbiRwYXJ0eV8yMDEyW21hdGNoKGluc3VyYW5jZV9sb25nJHN0YXRlLCBlbGVjdGlvbiRzdGF0ZSldCmluc3VyYW5jZSRwYXJ0eV8yMDEyIDwtIGVsZWN0aW9uJHBhcnR5XzIwMTJbbWF0Y2goaW5zdXJhbmNlJHN0YXRlLCBlbGVjdGlvbiRzdGF0ZSldCiAgIyBCRUEgcmVnaW9uCmluc3VyYW5jZV9sb25nJEJFQV9yZWdpb24gPC0gZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW21hdGNoKGluc3VyYW5jZV9sb25nJHN0YXRlLCBkZW1vZ3JhcGhpY3MxJHN0YXRlKV0KaW5zdXJhbmNlJEJFQV9yZWdpb24gPC0gZGVtb2dyYXBoaWNzMSRCRUFfcmVnaW9uW21hdGNoKGluc3VyYW5jZSRzdGF0ZSwgZGVtb2dyYXBoaWNzMSRzdGF0ZSldCiAgIyBJbmNvbWUgbGV2ZWwKaW5zdXJhbmNlX2xvbmckaW5jb21lX2xldmVsIDwtIGRlbW9ncmFwaGljczEkaW5jb21lX2xldmVsW21hdGNoKGluc3VyYW5jZV9sb25nJHN0YXRlLCBkZW1vZ3JhcGhpY3MxJHN0YXRlKV0KaW5zdXJhbmNlJGluY29tZV9sZXZlbCA8LSBkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFttYXRjaChpbnN1cmFuY2Ukc3RhdGUsIGRlbW9ncmFwaGljczEkc3RhdGUpXQoKIyBBbHNvIGZpbmQgbmF0aW9uLXdpZGUgdHJlbmQgZm9yIGluc3VyYW5jZQppbnN1cmFuY2VfbG9uZ19VUyA8LSBkYXRhLmZyYW1lKCJ5ZWFyIiA9IGMoMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSksICJ1bmluc3VyZWRfcGN0IiA9IGMoMTYuOCwgMTcuNSwgMTguMiwgMTcuMiwgMTYuOSwgMTYuNiwgMTMuMywgMTAuNSkpCmBgYAoKX19GaWd1cmUgMl9fCiAgIApUaGUgZm9sbG93aW5nIGZpZ3VyZSBkaXNwbGF5cyB0aGUgdHJlbmQgaW4gdGhlIHVuaW5zdXJlZCByYXRlIGJldHdlZW4gMjAwOCBhbmQgMjAxNS4gUmVzdWx0cyBhcmUgc2hvd24gZm9yIHRoZSBVU0EgYXZlcmFnZSAoaW4gYmxhY2spLCBhcyB3ZWxsIGFzIGZvciBldmVyeSBpbmRpdmlkdWFsIHN0YXRlIChpbiBjb2xvcikuIAoKV2Ugc2VlIGEgY2xlYXIgZG93bndhcmQgdHJlbmQgaW4gdGhlIHVuaW5zdXJlZCByYXRlIG9uY2UgbW9zdCBvZiB0aGUgQWZmb3JkYWJsZSBDYXJlIEFjdCAoQUNBKSBwcm92aXNpb25zIHdlcmUgaW1wbGVtZW50ZWQgaW4gMjAxNC4gVGhlIG92ZXJhbGwgVVMgdW5pbnN1cmVkIHJhdGUgZGVjcmVhc2VkIGZyb20gMTguMiUgaW4gMjAxMCB0byAxMC41JSBpbiAyMDE1LgoKSG93ZXZlciwgbm90ZSB0aGF0IHRoZSBkaXNwYXJpdGllcyBpbiB1bmluc3VyZWQgcmF0ZXMgbGFyZ2VseSBjb250aW51ZSB0byBwZXJzaXN0IGFtb25nIHRoZSBzdGF0ZXMsIHdpdGggcmVnaW9uYWwgcGF0dGVybnMgKHVzaW5nIEJ1cmVhdSBvZiBFY29ub21pYyBBbmFseXNpcyAoQkVBKSByZWdpb25zKS4gU3RhdGVzIG9mIHRoZSBTb3V0aGVhc3QgYW5kIFNvdXRod2VzdCBjb25zaXN0ZW50bHkgaGFkIHRoZSBoaWdoZXN0IHVuaW5zdXJlZCByYXRlcywgd2hpbGUgc3RhdGVzIG9mIE5ldyBFbmdsYW5kIGNvbnNpc3RlbmVseSBoYWQgdGhlIGxvd2VzdCBpbnN1cmVkIG9yIGhpZ2hlc3QgaGVhbHRoIGluc3VyYW5jZSBjb3ZlcmFnZSByYXRlcy4KICAgCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDIKCnBsb3QxIDwtIChnZ3Bsb3QoaW5zdXJhbmNlX2xvbmcsIGFlcyh5ZWFyLCB1bmluc3VyZWRfcGN0KSkgCiAgICAgICAgICArIGdlb21fbGluZShhZXMoY29sb3IgPSBCRUFfcmVnaW9uLCBncm91cCA9IHN0YXRlLCBsYWJlbCA9IHVuaW5zdXJlZF9udW0pKQogICAgICAgICAgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1KSkKICAgICAgICAgICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoNSwgMTAsIDE1LCAyMCwgMjUsIDMwKSkKICAgICAgICAgICsgbGFicyh4ID0gIlllYXIiLCB5ID0gIiUgVW5pbnN1cmVkIiwgY29sb3IgPSAiUmVnaW9uIikKICAgICAgICAgICsgZ2VvbV9saW5lKGRhdGEgPSBpbnN1cmFuY2VfbG9uZ19VUywgbHdkID0gMC44KQogICAgICAgICAgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDEwLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gImdyYXkzMCIpCiAgICAgICAgICArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwMTQsIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDA5LjQsIHkgPSAyNSwgbGFiZWwgPSAiT2JhbWEgXG5zaWducyBBQ0EiLCBjb2xvciA9ICJibGFjayIsZm9udGZhY2UgPSAyLCBzaXplID0gMykKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDEzLjQsIHkgPSAyNC41LCBsYWJlbCA9ICJNb3N0IEFDQSBcbnByb3Zpc2lvbnMgXG50YWtlIGVmZmVjdCIsIGNvbG9yID0gImJsYWNrIixmb250ZmFjZSA9IDIsIHNpemUgPSAzKQogICAgICAgICAgKyBhbm5vdGF0ZSgidGV4dCIseCA9IDIwMTQuMiwgeSA9IDExLCBsYWJlbCA9ICJVU0EgXG5BdmVyYWdlIiwgY29sb3IgPSAiYmxhY2siLGZvbnRmYWNlID0gMiwgc2l6ZSA9IDMpCiAgICAgICAgICArIGdndGl0bGUoIkNoYW5nZSBpbiBQZXJjZW50YWdlIFVuaW5zdXJlZCBieSBTdGF0ZSwgXG5mcm9tIDIwMDggdG8gMjAxNSIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAsIHNpemUgPSAxMikpKQpnZ3Bsb3RseShwbG90MSwgZHluYW1pY1RpY2tzID0gRkFMU0UsIHRvb2x0aXAgPSBjKCJzdGF0ZSIsICJ5ZWFyIiwgInVuaW5zdXJlZF9wY3QiLCAidW5pbnN1cmVkX251bSIpKQpgYGAKICAgCl9fRmlndXJlIDNfXwoKSW4gdGhlIGZvbGxvd2luZyBwbG90LCBJIGV4cGxvcmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBEZW1vY3JhdGljIGFuZCBSZXB1YmxpY2FuIHN0YXRlcywgYmFzZWQgb24gdGhlIDIwMTIgVVMgUHJlc2lkZW50aWFsIEVsZWN0aW9uIHJlc3VsdHMuIEdlbmVyYWxseSwgdGhlIGRlbW9jcmF0aWMgc3RhdGVzIGNvbnNpc3RlbnRseSBoYXZlIGhhZCBsYXJnZWx5IGhhdmUgYSBsb3dlciB1bmluc3VyZWQgcmF0ZSB0aGFuIHRoZSBSZXB1YmxpY2FuIHN0YXRlcywgdGhvdWdoIGJvdGggZ3JvdXBzIGV4cGVyaWVuY2VkIGRlY2xpbmVzIGluIHRoZSB1bmluc3VyZWQgcmF0ZXMgaW4gMjAxNC4gVGhlIHJhdGUgb2YgZGVjbGluZSBvZiB1bmluc3VyZWQgcmF0ZXMgaW4gMjAxNCBmb3IgbWFueSBSZXB1YmxpY2FuIHN0YXRlcyBhcHBlYXJlZCB0byBleGNlZWQgdGhhdCBvZiB0aGUgRGVtb2NyYXRpYyBzdGF0ZXMsIG1haW5seSBiZWNhdXNlIG9mIHRoZWlyIGhpZ2hlciBzdGFydGluZyBwb2ludC4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDMKcGxvdDIgPC0gKGdncGxvdChpbnN1cmFuY2VfbG9uZywgYWVzKHllYXIsIHVuaW5zdXJlZF9wY3QpKSAKICAgICAgICAgICsgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHBhcnR5XzIwMTIsIGdyb3VwID0gc3RhdGUsIGxhYmVsID0gdW5pbnN1cmVkX251bSkpCiAgICAgICAgICArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUpKQogICAgICAgICAgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYyg1LCAxMCwgMTUsIDIwLCAyNSwgMzApKQogICAgICAgICAgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygic3RlZWwgYmx1ZSIsICJmaXJlYnJpY2sxIikpIAogICAgICAgICAgKyBsYWJzKHggPSAiWWVhciIsIHkgPSAiJSBVbmluc3VyZWQiLCBjb2xvciA9ICJQYXJ0eSBcbigyMDEyIFdpbm5lcikiKQogICAgICAgICAgKyBnZW9tX2xpbmUoZGF0YSA9IGluc3VyYW5jZV9sb25nX1VTLCBsd2QgPSAxKQogICAgICAgICAgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDEwLCBsaW5ldHlwZSA9IDIsIGNvbG9yID0gImdyYXkzMCIpCiAgICAgICAgICArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwMTQsIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDA5LjQsIHkgPSAyNSwgbGFiZWwgPSAiT2JhbWEgXG5zaWducyBBQ0EiLCBjb2xvciA9ICJibGFjayIsZm9udGZhY2UgPSAyLCBzaXplID0gMykKICAgICAgICAgICsgYW5ub3RhdGUoInRleHQiLHggPSAyMDEzLjQsIHkgPSAyNC41LCBsYWJlbCA9ICJNb3N0IEFDQSBcbnByb3Zpc2lvbnMgXG50YWtlIGVmZmVjdCIsIGNvbG9yID0gImJsYWNrIixmb250ZmFjZSA9IDIsIHNpemUgPSAzKQogICAgICAgICAgKyBhbm5vdGF0ZSgidGV4dCIseCA9IDIwMTQuMiwgeSA9IDExLCBsYWJlbCA9ICJVU0EgXG5BdmVyYWdlIiwgY29sb3IgPSAiYmxhY2siLGZvbnRmYWNlID0gMiwgc2l6ZSA9IDMpCiAgICAgICAgICArIGdndGl0bGUoIkNoYW5nZSBpbiBQZXJjZW50YWdlIFVuaW5zdXJlZCBieSBQYXJ0eSwgXG5mcm9tIDIwMDggdG8gMjAxNSIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAsIHNpemUgPSAxMikpKQpnZ3Bsb3RseShwbG90MiwgZHluYW1pY1RpY2tzID0gRkFMU0UsICB0b29sdGlwID0gYygic3RhdGUiLCAieWVhciIsICJ1bmluc3VyZWRfcGN0IiwgInVuaW5zdXJlZF9udW0iKSkKYGBgCgpfX0ZpZ3VyZSA0X18KClRoaXMgcGxvdCBzaG93cyBpbnN1cmVkIHJhdGVzIGluIDIwMTUgYXQgYSBnbGFuY2UsIGxvb2tpbmcgYXQgaG93IHRoZXkgZGlmZmVyIGJ5IHBhcnR5ICgyMDEyIHdpbm5lciksIEJFQSByZWdpb24gYW5kIGluY29tZSBsZXZlbCBvZiB0aGUgc3RhdGVzLiAKCkluIHRlcm1zIG9mIGNvcnJlbGF0aW9ucywgaXQgYXBwZWFycyB0aGF0IGJlaW5nIGEgRGVtb2NyYXRpYyBzdGF0ZSBpcyBhIHN0cm9uZyBwcmVkaWN0b3Igb2YgYSBoaWdoZXIgaW5zdXJhbmNlIHJhdGUuIFN0YXRlcyBpbiBOZXcgRW5nbGFuZCwgdGhlIE1pZGVhc3QgYW5kIHRoZSBHcmVhdCBMYWtlcyBwZXJmb3JtIHdlbGwgaW4gaW5zdXJhbmNlIHJhdGVzLCB3aGlsZSBzdGF0ZXMgaW4gdGhlIFNvdXRod2VzdCwgUm9ja3kgTW91bnRhaW5zIGFuZCBTb3V0aGVhc3QgcGVyZm9ybSB0aGUgcG9vcmVzdC4gQXMgZXhwZWN0ZWQsIGhpZ2gtaW5jb21lIHN0YXRlcyBoYXZlIHRoZSBoaWdoZXN0IGluc3VyYW5jZSByYXRlcyBhcyBtb3JlIHBlb3BsZSB3b3VsZCBiZSBhYmxlIHRvIGFmZm9yZCBpbnN1cmFuY2UuIExvd2VyIGFuZCBsb3dlci1taWRkbGUgaW5jb21lIHN0YXRlcyBoYXZlIGxvd2VyIGNvdmVyYWdlIHJhdGVzLCBidXQgaXQgaXMgaW5mYWN0IHRoZSBsb3dlci1taWRkbGUgaW5jb21lIHN0YXRlcyB0aGF0IGhhdmUgdGhlIGxvd2VzdCBpbnN1cmFuY2UgcmF0ZXMuCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyMgUExPVCA0CgojIFN1YnNldCByZWxldmFudCB2YXJpYWJsZXMKaW5zdXJhbmNlXzIwMTUgPC0gaW5zdXJhbmNlWyAsIGMoInN0YXRlIiwgInVuaW5zdXJlZF9wY3RfMjAxNSIsICJpbnN1cmVkX3BjdF8yMDE1IiwgInBhcnR5XzIwMTIiLCAiQkVBX3JlZ2lvbiIsICJpbmNvbWVfbGV2ZWwiKV0KCiMgQm94cGxvdHMgYnkgcGFydHkKcGxvdDNhIDwtIChnZ3Bsb3QoaW5zdXJhbmNlXzIwMTUsIGFlcyh4ID0gcmVvcmRlcihwYXJ0eV8yMDEyLCBpbnN1cmVkX3BjdF8yMDE1KSwgeSA9IGluc3VyZWRfcGN0XzIwMTUpKSAKICAgICAgICAgICsgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gcGFydHlfMjAxMiwgbGFiZWwgPSBpbnN1cmVkX3BjdF8yMDE1KSwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgY29vcmRfZmxpcCgpCiAgICAgICAgICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInN0ZWVsIGJsdWUiLCAiZmlyZWJyaWNrIikpCiAgICAgICAgICArIGdndGl0bGUoIkRlbW9jcmF0aWMgdnMuIFJlcHVibGljYW4gU3RhdGVzIikKICAgICAgICAgICsgdGhlbWVfbWluaW1hbCgpCiAgICAgICAgICArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0ID0gMC4zNywgc2l6ZSA9IDEyKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkpCgojIEJveHBsb3RzIGJ5IEJFQSByZWdpb24KcGxvdDNiIDwtIChnZ3Bsb3QoaW5zdXJhbmNlXzIwMTUsIGFlcyh4ID0gcmVvcmRlcihCRUFfcmVnaW9uLCBpbnN1cmVkX3BjdF8yMDE1KSwgeSA9IGluc3VyZWRfcGN0XzIwMTUpKSAKICAgICAgICAgICsgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gQkVBX3JlZ2lvbiwgbGFiZWwgPSBpbnN1cmVkX3BjdF8yMDE1KSwgY29sb3IgPSAiZ3JheTMwIikKICAgICAgICAgICsgY29vcmRfZmxpcCgpCiAgICAgICAgICArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyZXdlci5wYWwobiA9IDgsIG5hbWUgPSAiRGFyazIiKSkKICAgICAgICAgICsgZ2d0aXRsZSgiQnkgQnVyZWF1IG9mIEVjb25vbWljIEFuYWx5c2lzIChCRUEpIFJlZ2lvbiIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuMjQsIHNpemUgPSAxMiksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpKQoKIyBCb3hwbG90cyBieSBpbmNvbWUgbGV2ZWwKcGxvdDNjIDwtIChnZ3Bsb3QoaW5zdXJhbmNlXzIwMTUsIGFlcyh4ID0gaW5jb21lX2xldmVsLCB5ID0gaW5zdXJlZF9wY3RfMjAxNSkpIAogICAgICAgICAgKyBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSBpbmNvbWVfbGV2ZWwsIGxhYmVsID0gaW5zdXJlZF9wY3RfMjAxNSksIGNvbG9yID0gImdyYXkzMCIpCiAgICAgICAgICArIGNvb3JkX2ZsaXAoKQogICAgICAgICAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBicmV3ZXIucGFsKG4gPSA0LCBuYW1lID0gIkRhcmsyIikpCiAgICAgICAgICArIGxhYnMoeCA9ICIiLCB5ID0gIiUgSW5zdXJlZCAoMjAxNSkiKQogICAgICAgICAgKyBnZ3RpdGxlKCJCeSBTdGF0ZSdzIEluY29tZSBMZXZlbCIpCiAgICAgICAgICArIHRoZW1lX21pbmltYWwoKQogICAgICAgICAgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuMzksIHNpemUgPSAxMiksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSkKCiMgQ29tYmluZSBwbG90cyB2ZXJ0aWNhbGx5CmdyaWQuYXJyYW5nZShwbG90M2EsIHBsb3QzYiwgcGxvdDNjLCBucm93ID0gMywgdG9wID0gIjIwMTUgSW5zdXJhbmNlIFJhdGVzIGF0IGEgR2xhbmNlIikKYGBgCgoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBTT01FIERBVEEgUkVTSEFQSU5HCgojIFJlc2hhcGUgYWNhX2dlbmVyYWwgKGxvbmcpLCBrZWVwaW5nIHRoZSBpbnRlcmVzdGluZyBxdWFudGl0aWVzCiAgIyBJbXBvcnQgdW5pbnN1cmVkIG51bWJlciAoMjAxNSkKYWNhX2dlbmVyYWwkdW5pbnNfYWxsXzE1IDwtIGluc3VyYW5jZSR1bmluc3VyZWRfbnVtXzIwMTVbbWF0Y2goYWNhX2dlbmVyYWwkc3RhdGUsIGluc3VyYW5jZSRzdGF0ZSldCiAgIyBLZWVwIG9ubHkgc2VsZWN0IHZhcmlhYmxlcwphY2FfZ2VuZXJhbF9sb25nIDwtIGFjYV9nZW5lcmFsWyAsIGMoInN0YXRlIiwgInN0YXRlX2FiYiIsICJjb3ZfZW1wIiwgImNvdl9ta3RfcGxhbl8xNiIsICJtZWRpY2FpZF9lbnJvbGxfMTYiLCAibWVkaWNhcmVfZW5yb2xsXzE2IiwgInVuaW5zX2FsbF8xNSIpXQogICMgVGhlIGFjdHVhbCByZXNoYXBpbmcKYWNhX2dlbmVyYWxfbG9uZyA8LSByZXNoYXBlKGFjYV9nZW5lcmFsX2xvbmcsIAogICAgICAgICAgICAgICAgICAgICAgdmFyeWluZyA9IGMoImNvdl9lbXAiLCAiY292X21rdF9wbGFuXzE2IiwgIm1lZGljYWlkX2Vucm9sbF8xNiIsICJtZWRpY2FyZV9lbnJvbGxfMTYiLCAidW5pbnNfYWxsXzE1IiksCiAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWVzID0gIk51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gIlNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgICB0aW1lcyA9IGMoIkVtcGxveWVyIiwgIk1hcmtldHBsYWNlIiwgIk1lZGljYWlkIC8gQ0hJUCIsICJNZWRpY2FyZSIsICJVbmluc3VyZWQiKSwKICAgICAgICAgICAgICAgICAgICAgIG5ldy5yb3cubmFtZXMgPSAxOjEwMDAsCiAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAibG9uZyIpCgojIExvb2stdXAgaW5mb3JtYXRpb24gaW50byBhY2FfZ2VuZXJhbF9sb25nLCBvbjoKICAjIFBhcnR5ICgyMDEyKQphY2FfZ2VuZXJhbF9sb25nJHBhcnR5XzIwMTIgPC0gZWxlY3Rpb24kcGFydHlfMjAxMlttYXRjaChhY2FfZ2VuZXJhbF9sb25nJHN0YXRlLCBlbGVjdGlvbiRzdGF0ZSldCiAgIyBCRUEgcmVnaW9uCmFjYV9nZW5lcmFsX2xvbmckQkVBX3JlZ2lvbiA8LSBkZW1vZ3JhcGhpY3MxJEJFQV9yZWdpb25bbWF0Y2goYWNhX2dlbmVyYWxfbG9uZyRzdGF0ZSwgZGVtb2dyYXBoaWNzMSRzdGF0ZSldCiAgIyBJbmNvbWUgbGV2ZWwKYWNhX2dlbmVyYWxfbG9uZyRpbmNvbWVfbGV2ZWwgPC0gZGVtb2dyYXBoaWNzMSRpbmNvbWVfbGV2ZWxbbWF0Y2goYWNhX2dlbmVyYWxfbG9uZyRzdGF0ZSwgZGVtb2dyYXBoaWNzMSRzdGF0ZSldCiAgIyBQb3B1bGF0aW9uCmFjYV9nZW5lcmFsX2xvbmckcG9wdWxhdGlvbl8yMDE1IDwtIGRlbW9ncmFwaGljczIkcG9wdWxhdGlvbl8yMDE1W21hdGNoKGFjYV9nZW5lcmFsX2xvbmckc3RhdGUsIGRlbW9ncmFwaGljczIkc3RhdGUpXQoKIyBDYWxjdWxhdGUgcGVyY2VudGFnZSBmcm9tIG51bWJlciBhbmQgcG9wdWxhdGlvbgphY2FfZ2VuZXJhbF9sb25nJHBlcmNlbnRhZ2UgPC0gYWNhX2dlbmVyYWxfbG9uZyROdW1iZXIgLyBhY2FfZ2VuZXJhbF9sb25nJHBvcHVsYXRpb25fMjAxNSAqIDEwMApgYGAKICAKICAKX19GaWd1cmUgNV9fCgpOZXh0LCB3ZSBpbnZlc3RpZ2F0ZSB0aGUgbWFpbiBoZWFsdGggaW5zdXJhbmNlIGFuZCBjb3ZlcmFnZSBzb3VyY2VzLCBuYW1lbHkgZW1wbG95ZXIgY292ZXJhZ2UsIHRoZSBpbmRpdmlkdWFsIG1hcmtldHBsYWNlLCBNZWRpY2FpZCAvIENoaWxkcmVucycgSGVhbHRoIEluc3VyYW5jZSBQcm9ncmFtIChDSElQKSwgYW5kIE1lZGljYXJlIGZvciB0aGUgYWdlZC4gV2UgYnJva2UgZG93biB0aGUgcmVzdWx0cyBieSBwYXJ0eSBhbmQgaW5jb21lIGxldmVsLCB0YWtpbmcgYSBzaW1wbGUgKHVud2VpZ2h0ZWQpIGF2ZXJhZ2UgYWNyb3NzIHRoZSBzdGF0ZXMgaW4gdGhlIGNhdGVnb3JpZXMuIFdlIG9ic2VydmUgdGhhdCBlbXBsb3llciBjb3ZlcmFnZSByYXRlcyBpbmNyZWFzZSBhcyBpbmNvbWUgbGV2ZWwgaW5jcmVhc2VzLCBlc3BlY2lhbGx5IGZvciBEZW1vY3JhdGljIHN0YXRlcy4gRGVtb2NyYXRpYyBhbmQgbG93IGluY29tZSBzdGF0ZXMgaGF2ZSBtb3JlIHBlb3BsZSBvbiBNZWRpY2FpZCAvIENISVAgdGhhbiBSZXB1YmxpY2FuIGFuZCBsb3cgaW5jb21lIHN0YXRlcy4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDUKCmFjYV9nZW5lcmFsX2xvbmdfYnlfcGFydHlfaW5jb21lIDwtIGRkcGx5KGFjYV9nZW5lcmFsX2xvbmcsIGMoInBhcnR5XzIwMTIiLCAiaW5jb21lX2xldmVsIiwgIlNvdXJjZSIpLCBzdW1tYXJpc2UsIGF2Z19wY3QgPSBtZWFuKHBlcmNlbnRhZ2UpKQoKcGxvdDQgPC0gKGdncGxvdChhY2FfZ2VuZXJhbF9sb25nX2J5X3BhcnR5X2luY29tZSwgYWVzKGluY29tZV9sZXZlbCwgYXZnX3BjdCwgZmlsbCA9IFNvdXJjZSkpCiAgICAgICAgICArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyBmYWNldF9ncmlkKHBhcnR5XzIwMTIgfiAuKQogICAgICAgICAgKyBsYWJzKHggPSAiSW5jb21lIExldmVsIiwgeSA9ICJBdmVyYWdlICUgaW4gU3RhdGUiLCBjb2xvciA9ICJTb3VyY2Ugb2YgXG5JbnN1cmFuY2UiKQogICAgICAgICAgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBicmV3ZXIucGFsKG4gPSA2LCBuYW1lID0gIkRhcmsyIilbYygxOjMsNiw0KV0pCiAgICAgICAgICArIGdndGl0bGUoIlNvdXJjZXMgb2YgSGVhbHRoIEluc3VyYW5jZSwgXG5ieSBQYXJ0eSBhbmQgSW5jb21lIExldmVsIikKICAgICAgICAgICsgdGhlbWVfbWluaW1hbCgpCiAgICAgICAgICArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIGhqdXN0ID0gMCwgc2l6ZSA9IDEyKSkpCmdncGxvdGx5KHBsb3Q0LCB0b29sdGlwID0gYygiaW5jb21lX2xldmVsIiwgIlNvdXJjZSIsICJhdmdfcGN0IikpCmBgYAoKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQUkVQQVJBVElPTiBGT1IgRlVSVEhFUiBQTE9UUyAoSU5DTFVESU5HIERBVEEgVEFCTEUpCgojIFdhbnQgdG8gY29tYmluZSBpbmZvcm1hdGlvbiBvbiBpbnN1cmFuY2UgY292ZXJhZ2Ugd2l0aCBrZXkgaW5mb3JtYXRpb24gb24gaGVhbHRoIG91dGNvbWVzL2FjY2VzcyBhbmQgYWZmb3JkYWJpbGl0eQoKa2V5X2luZGljYXRvcnMgPC0gc3RhdGVfYWJiX2xvb2t1cAoKIyMgTWVyZ2UgaW4gaW5mb3JtYXRpb24gdG8gdGhlIGRhdGEgdGFibGUgb24gdGhlIGZvbGxvd2luZwoKIyBEZW1vZ3JhcGhpYyBJbmZvcm1hdGlvbgogICMgSW5jb21lIGxldmVsCmtleV9pbmRpY2F0b3JzJGluY29tZV9sZXZlbCA8LSBkZW1vZ3JhcGhpY3MxJGluY29tZV9sZXZlbFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGRlbW9ncmFwaGljczEkc3RhdGVfYWJiKV0KCiMgSW5zdXJhbmNlIENvdmVyYWdlCiAgIyBQZXJjZW50YWdlIGluc3VyZWQgKDIwMTUpCmtleV9pbmRpY2F0b3JzJGluc3VyZWRfcGN0XzIwMTUgPC0gaW5zdXJhbmNlJGluc3VyZWRfcGN0XzIwMTVbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBpbnN1cmFuY2Ukc3RhdGVfYWJiKV0KICAjIFBlcmNlbnRhZ2UgaW5zdXJlZCAoMjAxNCkKa2V5X2luZGljYXRvcnMkaW5zdXJlZF9wY3RfMjAxNCA8LSBpbnN1cmFuY2UkaW5zdXJlZF9wY3RfMjAxNFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGluc3VyYW5jZSRzdGF0ZV9hYmIpXQogICMgSW5kaWNhdG9yOiBXaGV0aGVyIHN0YXRlIGhhcyBleHBhbmRlZCBtZWRpY2FyZQprZXlfaW5kaWNhdG9ycyRzdGF0ZV9oYXNfZXhwYW5kZWQgPC0gYWNhX2dlbmVyYWwkc3RhdGVfaGFzX2V4cGFuZGVkW21hdGNoKGtleV9pbmRpY2F0b3JzJHN0YXRlX2FiYiwgYWNhX2dlbmVyYWwkc3RhdGVfYWJiKV0KCiMgSGVhbHRoIG91dGNvbWVzIGFuZCBhY2Nlc3MKICAjIE1vcnRhbGl0eSBhbWVuYWJsZSB0byBoZWFsdGggY2FyZSwgZGVhdGhzIHBlciAxMDAwMCBwb3B1bGF0aW9uCmtleV9pbmRpY2F0b3JzJGRlYXRoc19hbWVuYWJsZV8yMDE0IDwtIGhlYWx0aF9pbmQkaC5kZWF0aHNfYW1lbmFibGUuMjAxNCBbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBoZWFsdGhfaW5kJHN0YXRlX2FiYildCiAgIyBZZWFycyBvZiBQb3RlbnRpYWwgTGlmZSBMb3N0IGJlZm9yZSA3NQprZXlfaW5kaWNhdG9ycyR5ZWFyc19saWZlX2xvc3QgPC0gaGVhbHRoX2luZCRoLnlyc19sb3N0X3BvdGVudGlhbF9saWZlX2JlZm9yZTc1LjIwMTQgW21hdGNoKGtleV9pbmRpY2F0b3JzJHN0YXRlX2FiYiwgaGVhbHRoX2luZCRzdGF0ZV9hYmIpXQogICMgQWR1bHRzIHdpdGggYSB1c3VhbCBzb3VyY2Ugb2YgY2FyZSAoJSkKa2V5X2luZGljYXRvcnMkdXN1YWxfY2FyZV8yMDE1IDwtIGhlYWx0aF9pbmQkcS53aXRoX3VzdWFsX2NhcmVfYWR1bHQuMjAxNSBbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBoZWFsdGhfaW5kJHN0YXRlX2FiYildCiAgIyBBZHVsdHMgd2l0aCBhZ2UvZ2VuZGVyLWFwcHJvcHJpYXRlIGNhbmNlciBzY3JlZW5pbmdzICglKQprZXlfaW5kaWNhdG9ycyR3aXRoX2NhbmNlcl9zY3JlZW5pbmcgPC0gaGVhbHRoX2luZCRxLndpdGhfY2FuY2VyX3NjcmVlbmluZ19hZHVsdC4yMDE0IFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGhlYWx0aF9pbmQkc3RhdGVfYWJiKV0KICAjIEFkdWx0cyB3aXRoIGFnZS1hcHByb3ByaWF0ZSB2YWNjaW5lcyAoJSkKa2V5X2luZGljYXRvcnMkd2l0aF92YWNjaW5lcyA8LSBoZWFsdGhfaW5kJHEud2l0aF92YWNjaW5lc19hZHVsdC4yMDE1IFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGhlYWx0aF9pbmQkc3RhdGVfYWJiKV0KCiMgQWZmb3JkYWJpbGl0eSBhbmQgY29zdC1lZmZpY2llbmN5CiAgIyBJbmRpdmlkdWFscyB1bmRlciBhZ2UgNjUgd2l0aCBoaWdoIE9PUCBtZWRpY2FsIGNvc3RzIHJlbGF0aXZlIHRvIGFubnVhbCBob3VzZWhvbGQgaW5jb21lCmtleV9pbmRpY2F0b3JzJGhpZ2hfT09QX3JlbGF0aXZlIDwtIGhlYWx0aF9pbmQkYS5oaWdoX09PUF9yZWxhdGl2ZV91bmRlcjY1LjIwMTUgW21hdGNoKGtleV9pbmRpY2F0b3JzJHN0YXRlX2FiYiwgaGVhbHRoX2luZCRzdGF0ZV9hYmIpXQogICMgQXZlcmFnZSBhbm51YWwgZ3Jvd3RoIGluIGZhbWlseSBwcmVtaXVtcyBmb3IgZW1wbG95ZXIgY292ZXJhZ2UgKGJldHdlZW4gMjAxMCBhbmQgMjAxNSkKa2V5X2luZGljYXRvcnMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIGFjYV9nZW5lcmFsJHByZW1pdW1fZW1wX2F2Z19ncm93dGhfcGN0XzEwdG8xNVttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGFjYV9nZW5lcmFsJHN0YXRlX2FiYildCiAgIyBNYXJrZXRwbGFjZSBjb25zdW1lcnMgd2hvIGNvdWxkIHNlbGVjdCBhIHBsYW4gZm9yIGxlc3MgdGhhbiAkMTAwCmtleV9pbmRpY2F0b3JzJElNX3BsYW5fdW5kZXJfMTAwIDwtIGFjYV9nZW5lcmFsJGNvdl9ta3RfdW5kZXIxMDBEX3BjdFttYXRjaChrZXlfaW5kaWNhdG9ycyRzdGF0ZV9hYmIsIGFjYV9nZW5lcmFsJHN0YXRlX2FiYildCiAgIyBOZXQgaW5jcmVhc2UgaW4gZmVkZXJhbCBzcGVuZGluZyAobWlsbGlvbnMpCmtleV9pbmRpY2F0b3JzJGluY3JfZmVkX3NwZW5kaW5nX21pbCA8LSBhY2FfZ2VuZXJhbCRmZWRfc3BlbmRpbmdfbmV0X2luY3JfaW5NaWxbbWF0Y2goa2V5X2luZGljYXRvcnMkc3RhdGVfYWJiLCBhY2FfZ2VuZXJhbCRzdGF0ZV9hYmIpXQpgYGAKCiAgCiMgKDIpIEhlYWx0aCBPdXRjb21lcyBhbmQgQWNjZXNzCgpfX0ZpZ3VyZSA2X18KCk5leHQsIHdlIGFyZSBpbnRlcmVzdGVkIHRvIGZpbmQgb3V0IGhvdyBoZWFsdGggaW5zdXJhbmNlIHJhdGVzIGNvcnJlbGF0ZXMgd2l0aCBoZWFsdGggb3V0Y29tZXMuIEluIHBhcnRpY3VsYXIsIHdlIGNhbiBsb29rIGF0IHRoZSBtZWFzdXJlIG9mIG1vcnRhbGl0eSBhbWVuYWJsZSB0byBoZWFsdGhjYXJlIGludGVydmVudGlvbiAtIHRoZSBudW1iZXIgb2YgZGVhdGhzIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByZXZlbnRlZCBieSBoZWFsdGhjYXJlIGluIHRoZSB5ZWFyIDIwMTQuIFdlIHBsb3QgYXZvaWRhYmxlIG1vcnRhbGl0eSAoMjAxNCkgYWdhaW5zdCBpbnN1cmFuY2UgcmF0ZXMgKDIwMTQpIGFuZCBvYnNlcnZlIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGFzIGV4cGVjdGVkLiBTdGF0ZXMgdGhhdCBoYXZlIGhpZ2hlciByYXRlcyBvZiBpbnN1cmFuY2UgYWxzbyBoYXZlIGJldHRlciBoZWFsdGggaW4gdGhpcyByZXNwZWN0LiBIb3dldmVyLCB3ZSBhbHNvIGNvbnRyb2wgZm9yIGluY29tZSBsZXZlbHMgYXMgbG93IGluY29tZSBsZXZlbHMgd291bGQgYmUgYSBtYWpvciBwcmVkaWN0b3Igb2YgcG9vciBoZWFsdGgsIGFzIGNvbmZpcm1lZCBpbiBvdXIgcGxvdC4gWWV0LCB3aXRoaW4gZWFjaCBpbmNvbWUgbGV2ZWwsIHRoZSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgcmVtYWlucywgYW5kIGl0IGlzIGVzcGVjaWFsbHkgcHJvbm91bmNlZCBhbW9uZyB0aGUgdXBwZXItbWlkZGxlIGluY29tZSBjb3VudHJpZXMuIAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFBMT1QgNgpwbG90NSA8LSAoZ2dwbG90KGtleV9pbmRpY2F0b3JzLCBhZXMoaW5zdXJlZF9wY3RfMjAxNCwgZGVhdGhzX2FtZW5hYmxlXzIwMTQpKQogICAgICAgICAgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGluY29tZV9sZXZlbCwgc2hhcGUgPSBzdGF0ZV9oYXNfZXhwYW5kZWQpLCBzaXplID0gMikKICAgICAgICAgICsgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gaW5jb21lX2xldmVsLCBncm91cCA9IGluY29tZV9sZXZlbCksIG1ldGhvZCA9ICJsbSIsIGx3ZCA9IDEsIHNlID0gRkFMU0UpCiAgICAgICAgICArIGdlb21fc21vb3RoKGNvbG9yID0gImJsYWNrIiwgbWV0aG9kID0gImxtIiwgbGluZXR5cGUgPSAyLCBsd2QgPSAxLCBzZSA9IEZBTFNFKQogICAgICAgICAgKyBsYWJzKHggPSAiJSBJbnN1cmVkIiwgeSA9ICJEZWF0aHMgUHJldmVudGFibGUgYnkgSGVhbHRoY2FyZSBJbnRlcnZlbnRpb24gXG4ocGVyIDEwMCwwMDAgUGVvcGxlKSIsIGNvbG9yID0gIkluY29tZSBcbkxldmVsIiwgc2hhcGUgPSAiU3RhdGUgaGFzIFxuRXhwYW5kZWQgXG5NZWRpY2FpZCIpCiAgICAgICAgICArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBicmV3ZXIucGFsKG4gPSA0LCBuYW1lID0gIkRhcmsyIikpCiAgICAgICAgICArIGdndGl0bGUoIlJlbGF0aW9uc2hpcCBCZXR3ZWVuIEF2b2lkYWJsZSBNb3J0YWxpdHkgYW5kIFxuSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSBBbW9uZyBTdGF0ZXMiKQogICAgICAgICAgKyB0aGVtZV9taW5pbWFsKCkKICAgICAgICAgICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3QgPSAwLjUsIHNpemUgPSAxMikpKQpwbG90NQpgYGAKCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyMgREFUQSBQUk9DRVNTSU5HIEZPUiBNQVBTCgojIE9idGFpbiBzaGFwZSBmaWxlcyBvZiBVUyBzdGF0ZXMKbWFwX3N0YXRlcyA9IG1hcCgic3RhdGUiLCBmaWxsID0gVFJVRSwgcGxvdCA9IEZBTFNFKQoKIyBTdGFuZGFyZGl6ZSBuYW1lIGZvcm1hdCB3aXRoIHJlc3Qgb2YgYXNzaWdubWVudAogICMgRnVuY3Rpb24gdG8gY29udmVyIHRvIHByb3BlciBjYXNlCnByb3BlckNhc2UgPC0gZnVuY3Rpb24oeCkgewogIHMgPC0gc3Ryc3BsaXQoeCwgIiAiKVtbMV1dCiAgcGFzdGUodG91cHBlcihzdWJzdHJpbmcocywgMSwxKSksIHN1YnN0cmluZyhzLCAyKSwKICAgICAgc2VwPSIiLCBjb2xsYXBzZT0iICIpCn0KICAjIENvbnZlcnQgdG8gcHJvcGVyIGNhc2UKbWFwX3N0YXRlcyRzdGF0ZSA8LSBzYXBwbHkobWFwX3N0YXRlcyRuYW1lcywgcHJvcGVyQ2FzZSkKICAjIFJlbmFtZSB0aGUgbWFpbiBjb21wb25lbnQgb2Ygc3RhdGVzIHdpdGggbXVsdGlwbGUgcGFydHMgaW4gdGhlIG1hcAptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIk1hc3NhY2h1c2V0dHM6bWFpbiJdIDwtICJNYXNzYWNodXNldHRzIgptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIk1pY2hpZ2FuOnNvdXRoIl0gPC0gIk1pY2hpZ2FuIgptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIk5ldyBZb3JrOm1haW4iXSA8LSAiTmV3IFlvcmsiCm1hcF9zdGF0ZXMkc3RhdGVbbWFwX3N0YXRlcyRzdGF0ZSA9PSAiTm9ydGggQ2Fyb2xpbmE6bWFpbiJdIDwtICJOb3J0aCBDYXJvbGluYSIKbWFwX3N0YXRlcyRzdGF0ZVttYXBfc3RhdGVzJHN0YXRlID09ICJWaXJnaW5pYTptYWluIl0gPC0gIlZpcmdpbmlhIgptYXBfc3RhdGVzJHN0YXRlW21hcF9zdGF0ZXMkc3RhdGUgPT0gIldhc2hpbmd0b246bWFpbiJdIDwtICJXYXNoaW5ndG9uIgogICMgTWF0Y2ggd2l0aCBzdGF0ZSBhYmJyZXZpYXRpb25zCm1hcF9zdGF0ZXMkc3RhdGVfYWJiIDwtIHN0YXRlX2FiYl9sb29rdXAkc3RhdGVfYWJiW21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIHN0YXRlX2FiYl9sb29rdXAkc3RhdGUpXQogICMgVGhlbiBzdHJpcCBvZmYgYWxsIHRoZSBleHRyYSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3Igc3RhdGVzIHdpdGggbXVsdGlwbGUgcGFydHMgKGxlYXZpbmcganVzdCB0aGUgc3RhdGUgbmFtZSkKZm9yIChpIGluIDE6bGVuZ3RoKG1hcF9zdGF0ZXMkc3RhdGUpKSB7CiAgbWFwX3N0YXRlcyRzdGF0ZVtpXSA8LSB1bmxpc3Qoc3Ryc3BsaXQobWFwX3N0YXRlcyRzdGF0ZVtpXSwgIjoiKSlbMV0KfQoKIyBHZXQgY29vcmRpbmF0ZXMgb2Ygc3RhdGUgY2VudGVycwpzdGF0ZXNfY2VudGVycyA8LSBzdGF0ZS5jZW50ZXIKc3RhdGUuY2VudGVyIDwtIGNiaW5kKHN0YXRlc19jZW50ZXJzLCBzdGF0ZV9hYmJfbG9va3VwKQoKIyBIZWFsdGggb3V0Y29tZXM6IEltcG9ydCBrZXkgaW5kaWNhdG9ycyBkYXRhLCBtYXRjaGVkIGJ5IHN0YXRlCiAgICAjIFJlbWVtYmVyIHRvIGxhdGVyIG1hdGNoIGluZm9ybWF0aW9uIGJhc2VkIG9uIHN0YXRlLCBub3Qgc3RhdGUgYWJicmV2aWF0aW9uIChkdWUgdG8gaG93IHdlIGxhYmVsbGVkIGFib3ZlKQptYXBfc3RhdGVzJGRlYXRoc19hbWVuYWJsZV8yMDE0IDwtIGtleV9pbmRpY2F0b3JzJGRlYXRoc19hbWVuYWJsZV8yMDE0W21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIGtleV9pbmRpY2F0b3JzJHN0YXRlKV0KbWFwX3N0YXRlcyR1c3VhbF9jYXJlXzIwMTUgPC0ga2V5X2luZGljYXRvcnMkdXN1YWxfY2FyZV8yMDE1W21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIGtleV9pbmRpY2F0b3JzJHN0YXRlKV0KbWFwX3N0YXRlcyR3aXRoX2NhbmNlcl9zY3JlZW5pbmcgPC0ga2V5X2luZGljYXRvcnMkd2l0aF9jYW5jZXJfc2NyZWVuaW5nW21hdGNoKG1hcF9zdGF0ZXMkc3RhdGUsIGtleV9pbmRpY2F0b3JzJHN0YXRlKV0KbWFwX3N0YXRlcyR3aXRoX3ZhY2NpbmVzIDwtIGtleV9pbmRpY2F0b3JzJHdpdGhfdmFjY2luZXNbbWF0Y2gobWFwX3N0YXRlcyRzdGF0ZSwga2V5X2luZGljYXRvcnMkc3RhdGUpXQoKIyBDb3N0IG91dGNvbWVzOiBJbXBvcnQga2V5IGluZGljYXRvcnMgZGF0YSwgbWF0Y2hlZCBieSBzdGF0ZQogICAgIyBSZW1lbWJlciB0byBsYXRlciBtYXRjaCBpbmZvcm1hdGlvbiBiYXNlZCBvbiBzdGF0ZSwgbm90IHN0YXRlIGFiYnJldmlhdGlvbiAoZHVlIHRvIGhvdyB3ZSBsYWJlbGxlZCBhYm92ZSkKbWFwX3N0YXRlcyRoaWdoX09PUF9yZWxhdGl2ZSA8LSBrZXlfaW5kaWNhdG9ycyRoaWdoX09PUF9yZWxhdGl2ZVttYXRjaChtYXBfc3RhdGVzJHN0YXRlLCBrZXlfaW5kaWNhdG9ycyRzdGF0ZSldCm1hcF9zdGF0ZXMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIGtleV9pbmRpY2F0b3JzJHByZW1pdW1fYW5uX2dyb3d0aF8xMF8xNVttYXRjaChtYXBfc3RhdGVzJHN0YXRlLCBrZXlfaW5kaWNhdG9ycyRzdGF0ZSldCm1hcF9zdGF0ZXMkSU1fcGxhbl91bmRlcl8xMDAgPC0ga2V5X2luZGljYXRvcnMkSU1fcGxhbl91bmRlcl8xMDBbbWF0Y2gobWFwX3N0YXRlcyRzdGF0ZSwga2V5X2luZGljYXRvcnMkc3RhdGUpXQptYXBfc3RhdGVzJGluY3JfZmVkX3NwZW5kaW5nX21pbCA8LSBrZXlfaW5kaWNhdG9ycyRpbmNyX2ZlZF9zcGVuZGluZ19taWxbbWF0Y2gobWFwX3N0YXRlcyRzdGF0ZSwga2V5X2luZGljYXRvcnMkc3RhdGUpXQpgYGAKCgpfX0ZpZ3VyZSA3X18KClRoZSBmb2xsb3dpbmcgbWFwcyBob3cgdGhlIHN0YXRlcyBwZXJmb3JtZWQgaW4gdmFyaW91cyBoZWFsdGggb3V0Y29tZXMsIG5hbWVseSBwcmV2ZW50YWJsZSBtb3J0YWxpdHksIGFjY2VzcyB0byBhIHVzdWFsIHNvdXJjZSBvZiBjYXJlLCByYXRlIG9mIGFnZS1hcHByb3ByaWF0ZSBjYW5jZXIgc2NyZWVuaW5ncyBpbiBhZHVsdHMsIGFuZCByYXRlIG9mIGFnZS1hcHByb3ByaWF0ZSB2YWNjaW5hdGlvbnMgaW4gYWR1bHRzLiBBIGdyZWVuIGNvbG9yIGluY2lkYXRlcyBhIGNvbXBhcmF0aXZlbHkgbW9yZSBmYXZvcmFibGUgb3V0Y29tZSwgd2hpbGUgYSByZWQgY29sb3IgaW5kaWNhdGVzIGEgbGVzcyBmYXZvcmFibGUgb3V0Y29tZS4KCldlIG5vdGUgdGhhdCB0aGUgTm9ydGhlYXN0IChOZXcgRW5nbGFuZCkgc3RhdGVzIHBlcmZvcm0gY29uc2lzdGVudGx5IHdlbGwgYWNyb3NzIGFsbCBoZWFsdGggb3V0Y29tZXMsIHdoaWxlIHRoZSBTb3V0aGVhc3Qgc3RhdGVzLCBhcyB3ZWxsIGFzIFRleGVzLCBwZWZvcm0gY29uc2lzdGVudGx5IHBvb3JseSBvbiBhbGwgZXhjZXB0IGZvciB2YWNjaW5hdGlvbiByYXRlcy4gVGhlIFdlc3Rlcm4gYW5kIFJvY2t5IE1vdW50YWlucyBzdGF0ZXMgaGF2ZSBhIGxvdyBhdm9pZGFibGUgbW9ydGFsaXR5IHJhdGUsIGRlc3BpdGUgaGF2aW5nIGxvdyByYXRlcyBvZiBhY2Nlc3MgdG8gdXN1YWwgY2FyZSBhbmQgb2YgY2FuY2VyIHNjcmVlbmluZyBhbmQgdmFjY2luYXRpb25zLiBJbiB0aGUgbWVhc3VyZSBvZiBhZHVsdCB2YWNjaW5hdGlvbiByYXRlcywgdGhlIHRyZW5kIG9mIHRoZSBTb3V0aCBmYXJpbmcgcG9vcmVyIG9uIGhlYWx0aCBpcyByZXZlcnNlZCwgYXMgdGhleSBkbyBjb21wYXJhdGl2ZWx5IHdlbGwgaW4gdmFjY2luYXRpb25zLgogIAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFBMT1QgNzogTEVBRkxFVCBNQVAgLSBIRUFMVEggT1VUQ09NRVMKCihsZWFmbGV0KG1hcF9zdGF0ZXMpICU+JSAKICAgIHNldFZpZXcobGF0PTM5LjgyODIsIGxuZz0tOTYgLCB6b29tPTQpICU+JQogICAgYWRkUG9seWdvbnMoY29sb3IgPSAiIzMzMzMzMyIsIHdlaWdodCA9IDEsIHNtb290aEZhY3RvciA9IDAuNSwgZmlsbE9wYWNpdHkgPSAwKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIlByZXZlbnRhYmxlIERlYXRocyIsIGZpbGxDb2xvciA9IH5jb2xvclF1YW50aWxlKCJSZFlsR24iLCAtZGVhdGhzX2FtZW5hYmxlXzIwMTQpKC1kZWF0aHNfYW1lbmFibGVfMjAxNCksIHNtb290aEZhY3RvciA9IDAuNSwgc3Ryb2tlID0gRkFMU0UsIGZpbGxPcGFjaXR5ID0gMC42LCBwb3B1cCA9IHBhc3RlKCI8Yj5TdGF0ZTogPC9iPiIsIG1hcF9zdGF0ZXMkc3RhdGUsICI8YnIvPiIsICI8Yj5QcmV2ZW50YWJsZSBNb3J0YWxpdHk8L2I+IiwgIjxici8+IiwgIjxiPnBlciAxMDAsMDAwOiA8L2I+IiwgbWFwX3N0YXRlcyRkZWF0aHNfYW1lbmFibGVfMjAxNCkpICU+JQogICAgYWRkUG9seWdvbnMoZ3JvdXAgPSAiQWNjZXNzIHRvIFVzdWFsIENhcmUiLCBmaWxsQ29sb3IgPSB+Y29sb3JRdWFudGlsZSgiUmRZbEduIiwgdXN1YWxfY2FyZV8yMDE1KSh1c3VhbF9jYXJlXzIwMTUpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+QWNjZXNzIHRvIFVzdWFsPC9iPiIsICI8YnIvPiIsICI8Yj5Tb3VyY2Ugb2YgQ2FyZTogPC9iPiIsIG1hcF9zdGF0ZXMkdXN1YWxfY2FyZV8yMDE1LCAiJSIpKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIkNhbmNlciBTY3JlZW5pbmdzIFJhdGUiLCBmaWxsQ29sb3IgPSB+Y29sb3JRdWFudGlsZSgiUmRZbEduIiwgd2l0aF9jYW5jZXJfc2NyZWVuaW5nKSh3aXRoX2NhbmNlcl9zY3JlZW5pbmcpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+Q2FuY2VyIFNjcmVlbmluZ3M8L2I+IiwgIjxici8+IiwgIjxiPlJhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHdpdGhfY2FuY2VyX3NjcmVlbmluZywgIiUiKSkgJT4lCiAgICBhZGRQb2x5Z29ucyhncm91cCA9ICJBZHVsdCBWYWNjaW5hdGlvbiBSYXRlIiwgZmlsbENvbG9yID0gfmNvbG9yUXVhbnRpbGUoIlJkWWxHbiIsIHdpdGhfdmFjY2luZXMpKHdpdGhfdmFjY2luZXMpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+VmFjY2luYXRpb248L2I+IiwgIjxici8+IiwgIjxiPlJhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHdpdGhfdmFjY2luZXMsICIlIikpICU+JQogICAgYWRkTGFiZWxPbmx5TWFya2VycyhkYXRhID0gZmlsdGVyKHN0YXRlLmNlbnRlciwgc3RhdGVfYWJiIT0iQUsiICYgc3RhdGVfYWJiIT0iSEkiKSwgbG5nID0gfngsIGxhdCA9IH55LCBsYWJlbCA9IH5zdGF0ZV9hYmIsIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyhub0hpZGUgPSBULCBkaXJlY3Rpb24gPSAndG9wJywgdGV4dE9ubHkgPSBUKSkgJT4lCiAgICBhZGRMYXllcnNDb250cm9sKAogICAgICBiYXNlR3JvdXBzID0gYygiUHJldmVudGFibGUgRGVhdGhzIiwgIkFjY2VzcyB0byBVc3VhbCBDYXJlIiwgIkNhbmNlciBTY3JlZW5pbmdzIFJhdGUiLCAiQWR1bHQgVmFjY2luYXRpb24gUmF0ZSIpLAogICAgICBvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoY29sbGFwc2VkID0gRkFMU0UpKSkgCmBgYAoKCiMgKDMpIEFmZm9yZGFiaWxpdHkgYW5kIENvc3QgT3V0Y29tZXMKCl9fRmlndXJlIDhfXwoKU2ltaWxhcmx5LCB3ZSBtYXAgaG93IHRoZSBzdGF0ZXMgcGVyZm9ybWVkIGluIHZhcmlvdXMgZmluYW5jaWFsIGFuZCBjb3N0IG91dGNvbWVzLCBzdWNoIGFzIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGggaGlnaCBPT1AgY29zdHMgcmVsYXRpdmUgdG8gaG91c2Vob2xkIGluY29tZSwgcHJlbWl1bSBncm93dGggcmF0ZXMsIGFmZm9yZGFiaWxpdHkgb2YgdGhlIG1hcmtldHBsYWNlIHBsYW5zLCBhbmQgaW5jcmVhc2VzIGluIGZlZGVyYWwgc3BlbmRpbmcgcmVsYXRlZCB0byB0aGUgc3RhdGUuIAoKV2Ugbm90aWNlIHRoYXQgc3RhdGVzIHRoYXQgZG8gYmV0dGVyIGluIGNvbnRhaW5pbmcgT09QIGNvc3RzIHRlbmQgdG8gZG8gd29yc2UgaW4gY29udGFpbmluZyBwcmVtaXVtIGFuZCBtYXJrZXRwbGFjZSBwbGFuIHJhdGVzIGFzIHdlbGwgYXMgZmVkZXJhbCBzcGVuZGluZy4gVGhlc2UgaW5jbHVkZSBzb21lIHN0YXRlcyBsaWtlIE5ldyBZb3JrLCBOZXcgSmVyc2V5IGFuZCBPaGlvIGluIHRoZSBOb3J0aGVhc3QgYW5kIE1pZHdlc3QgKEdyZWF0IExha2VzKS4gQSBub3RhYmxlIGV4Y2VwdGlvbiBpcyBNYXNzYWNodXNzZXRzLCB3aGljaCBwZXJmb3JtcyB3ZWxsIGFjcm9zcyB0aGUgZmluYW5jaWFsIG1lYXN1cmVzLCBwb3NzaWJseSBiZWNhdXNlIG9mIHRoZSBoZWFkc3RhcnQgaXQgZ290IHdpdGggIlJvbW5leS1jYXJlIiwgd2hpY2ggYWN0dWFsbHkgc2VydmVkIGFzIGEgbW9kZWwgZm9yIE9iYW1hY2FyZS4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQojIyBQTE9UIDg6IExFQUZMRVQgTUFQIC0gQUZGT1JEQUJJTElUWSAvIENPU1QgT1VUQ09NRVMKCihsZWFmbGV0KG1hcF9zdGF0ZXMpICU+JSAKICAgIHNldFZpZXcobGF0PTM5LjgyODIsIGxuZz0tOTYgLCB6b29tPTQpICU+JQogICAgYWRkUG9seWdvbnMoY29sb3IgPSAiIzMzMzMzMyIsIHdlaWdodCA9IDEsIHNtb290aEZhY3RvciA9IDAuNSwgZmlsbE9wYWNpdHkgPSAwKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIkNvbnRhaW5lZCBPT1AgQ29zdHMiLCBmaWxsQ29sb3IgPSB+Y29sb3JRdWFudGlsZSgiUmRZbEduIiwgLWhpZ2hfT09QX3JlbGF0aXZlKSgtaGlnaF9PT1BfcmVsYXRpdmUpLCBzbW9vdGhGYWN0b3IgPSAwLjUsIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNiwgcG9wdXAgPSBwYXN0ZSgiPGI+U3RhdGU6IDwvYj4iLCBtYXBfc3RhdGVzJHN0YXRlLCAiPGJyLz4iLCAiPGI+SGlnaCBPT1AgUmVsYXRpdmU8L2I+IiwgIjxici8+IiwgIjxiPnRvIEluY29tZTogPC9iPiIsIG1hcF9zdGF0ZXMkaGlnaF9PT1BfcmVsYXRpdmUsICIlIikpICU+JQogICAgYWRkUG9seWdvbnMoZ3JvdXAgPSAiUHJlbWl1bSBHcm93dGggUmF0ZSIsIGZpbGxDb2xvciA9IH5jb2xvclF1YW50aWxlKCJSZFlsR24iLCAtcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1KSgtcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1KSwgc21vb3RoRmFjdG9yID0gMC41LCBzdHJva2UgPSBGQUxTRSwgZmlsbE9wYWNpdHkgPSAwLjYsIHBvcHVwID0gcGFzdGUoIjxiPlN0YXRlOiA8L2I+IiwgbWFwX3N0YXRlcyRzdGF0ZSwgIjxici8+IiwgIjxiPkFubnVhbCBQcmVtaXVtPC9iPiIsICI8YnIvPiIsICI8Yj5Hcm93dGggUmF0ZTogPC9iPiIsIG1hcF9zdGF0ZXMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1LCAiJSIpKSAlPiUKICAgIGFkZFBvbHlnb25zKGdyb3VwID0gIkFmZm9yZGFibGUgSW5kaXZpZHVhbCBNYXJrZXRwbGFjZSBQbGFuIiwgZmlsbENvbG9yID0gfmNvbG9yUXVhbnRpbGUoIlJkWWxHbiIsIElNX3BsYW5fdW5kZXJfMTAwKShJTV9wbGFuX3VuZGVyXzEwMCksIHNtb290aEZhY3RvciA9IDAuNSwgc3Ryb2tlID0gRkFMU0UsIGZpbGxPcGFjaXR5ID0gMC42LCBwb3B1cCA9IHBhc3RlKCI8Yj5TdGF0ZTogPC9iPiIsIG1hcF9zdGF0ZXMkc3RhdGUsICI8YnIvPiIsICI8Yj5NYXJrZXRwbGFjZSBDb25zdW1lcnM8L2I+IiwgIjxici8+IiwgIjxiPldobyBDYW4gU2VsZWN0IFBsYW48L2I+IiwgIjxici8+IiwiPGI+VW5kZXIgJDEwMDogPC9iPiIsIG1hcF9zdGF0ZXMkSU1fcGxhbl91bmRlcl8xMDAgKiAxMDAsICIlIikpICU+JQogICAgYWRkUG9seWdvbnMoZ3JvdXAgPSAiSW5jcmVhc2UgaW4gRmVkZXJhbCBTcGVuZGluZyIsIGZpbGxDb2xvciA9IH5jb2xvclF1YW50aWxlKCJSZFlsR24iLCAtaW5jcl9mZWRfc3BlbmRpbmdfbWlsKSgtaW5jcl9mZWRfc3BlbmRpbmdfbWlsKSwgc21vb3RoRmFjdG9yID0gMC41LCBzdHJva2UgPSBGQUxTRSwgZmlsbE9wYWNpdHkgPSAwLjYsIHBvcHVwID0gcGFzdGUoIjxiPlN0YXRlOiA8L2I+IiwgbWFwX3N0YXRlcyRzdGF0ZSwgIjxici8+IiwgIjxiPk5ldCBJbmNyZWFzZSBpbiBGZWRlcmFsPC9iPiIsICI8YnIvPiIsICI8Yj5TcGVuZGluZzwvYj46ICQiLCBtYXBfc3RhdGVzJGluY3JfZmVkX3NwZW5kaW5nX21pbCwgIm1pbGxpb24iKSkgJT4lCiAgICBhZGRMYWJlbE9ubHlNYXJrZXJzKGRhdGEgPSBmaWx0ZXIoc3RhdGUuY2VudGVyLCBzdGF0ZV9hYmIhPSJBSyIgJiBzdGF0ZV9hYmIhPSJISSIpLCBsbmcgPSB+eCwgbGF0ID0gfnksIGxhYmVsID0gfnN0YXRlX2FiYiwgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKG5vSGlkZSA9IFQsIGRpcmVjdGlvbiA9ICd0b3AnLCB0ZXh0T25seSA9IFQpKSAlPiUKICAgIGFkZExheWVyc0NvbnRyb2woCiAgICAgIGJhc2VHcm91cHMgPSBjKCJDb250YWluZWQgT09QIENvc3RzIiwgIlByZW1pdW0gR3Jvd3RoIFJhdGUiLCAiQWZmb3JkYWJsZSBJbmRpdmlkdWFsIE1hcmtldHBsYWNlIFBsYW4iLCAiSW5jcmVhc2UgaW4gRmVkZXJhbCBTcGVuZGluZyIpLAogICAgICBvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoY29sbGFwc2VkID0gRkFMU0UpKSkgCmBgYAoKCiMgU3VtbWFyeSBvZiBTdGF0ZXMnIFBlcmZvcm1hbmNlCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KIyBDcmVhdGUgZGF0YSB0YWJsZSByZXBvcnRpbmcgdmFsdWVzCmRhdGFfdGFibGVfdmFsdWVzIDwtIGtleV9pbmRpY2F0b3JzWyAsIGMoInN0YXRlIiwgImluc3VyZWRfcGN0XzIwMTUiLCAiZGVhdGhzX2FtZW5hYmxlXzIwMTQiLCAidXN1YWxfY2FyZV8yMDE1IiwgImhpZ2hfT09QX3JlbGF0aXZlIiwgInByZW1pdW1fYW5uX2dyb3d0aF8xMF8xNSIpXQoKIyBDcmVhdGUgZGF0YSB0YWJsZSByZXBvcnRpbmcgcmFuawpkYXRhX3RhYmxlX3JhbmsgPC0gZGF0YV90YWJsZV92YWx1ZXMKCiMgQ29udmVydCBlYWNoIGZ1bmN0aW9uIHRvIHJhbmsKICAjIFJhbmsgMSBpcyBhbHdheXMgbW9yZSBmYXZvcmFibGUgKHJlZ2FyZGxlc3Mgb2YgZGVmaW5pdGlvbiBvZiB2YXJpYWJsZSkgICAgCmRhdGFfdGFibGVfcmFuayRyX2luc3VyZWRfcGN0XzIwMTUgPC0gcmFuaygtZGF0YV90YWJsZV92YWx1ZXMkaW5zdXJlZF9wY3RfMjAxNSwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfZGVhdGhzX2FtZW5hYmxlXzIwMTQgPC0gcmFuayhkYXRhX3RhYmxlX3ZhbHVlcyRkZWF0aHNfYW1lbmFibGVfMjAxNCwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfdXN1YWxfY2FyZV8yMDE1IDwtIHJhbmsoLWRhdGFfdGFibGVfdmFsdWVzJHVzdWFsX2NhcmVfMjAxNSwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfaGlnaF9PT1BfcmVsYXRpdmUgPC0gcmFuayhkYXRhX3RhYmxlX3ZhbHVlcyRoaWdoX09PUF9yZWxhdGl2ZSwgbmEubGFzdCA9ICJrZWVwIiwgdGllcy5tZXRob2QgPSAibWluIikKZGF0YV90YWJsZV9yYW5rJHJfcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIHJhbmsoZGF0YV90YWJsZV92YWx1ZXMkcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1LCBuYS5sYXN0ID0gImtlZXAiLCB0aWVzLm1ldGhvZCA9ICJtaW4iKQogICMgUmVtb3ZlIHZhbHVlIHZhcmlhYmxlcwpkYXRhX3RhYmxlX3JhbmskaW5zdXJlZF9wY3RfMjAxNSA8LSBOVUxMCmRhdGFfdGFibGVfcmFuayRkZWF0aHNfYW1lbmFibGVfMjAxNCA8LSBOVUxMCmRhdGFfdGFibGVfcmFuayR1c3VhbF9jYXJlXzIwMTUgPC0gTlVMTApkYXRhX3RhYmxlX3JhbmskaGlnaF9PT1BfcmVsYXRpdmUgPC0gTlVMTApkYXRhX3RhYmxlX3JhbmskcHJlbWl1bV9hbm5fZ3Jvd3RoXzEwXzE1IDwtIE5VTEwKYGBgCgpUaGUgZm9sbG93aW5nIGRhdGEgdGFibGUgcHJlc2VudHMgdGhlIHJhbmtpbmdzIG9mIHRoZSBzdGF0ZXMgb24gdGhlIGZvbGxvd2luZyBpbnN1cmFuY2UgY292ZXJhZ2UsIGhlYWx0aCBhbmQgYWZmb3JkYWJpbGl0eSBvdXRjb21lcywgcHJvdmlkaW5nIGEgc3VtbWFyeSBvZiB0aGUgc3RhdGVzJyBwZXJmb3JtYW5jZToKCjEpIFBlcmNlbnRhZ2Ugb2YgcG9wdWxhdGlvbiBpbnN1cmVkCgoyKSBEZWF0aHMgcHJldmVudGFibGUgYnkgaGVhbHRoY2FyZSBpbnRlcnZlbnRpb24gKHBlciAxMDAsMDAwIHBlb3BsZSkKCjMpIFByb3BvcnRpb24gb2YgYWR1bHRzIHdpdGggYWNjZXNzIHRvIGEgdXN1YWwgc291cmNlIG9mIGNhcmUKCjQpIFByb3BvcnRpb24gb2YgcGVvcGxlIHdpdGggaGlnaCBvdXQtb2YtcG9ja2V0IGNvc3RzIChyZWxhdGl2ZSB0byBob3VzZWhvbGQgaW5jb21lKQoKNSkgQW5udWFsIHJhdGUgb2YgaGVhbHRoIGluc3VyYW5jZSBwcmVtaXVtIGdyb3d0aCBmcm9tIDIwMTAgdG8gMjAxNQoKQSByYW5rIG9mIDEgYWx3YXlzIGluZGljYXRlcyB0aGUgbW9yZSBmYXZvcmFibGUgb3V0Y29tZSAoaS5lLiBoaWdoZXIgaW5zdXJhbmNlIGFuZCB0cmVhdG1lbnQgYWNjZXNzIHJhdGUsIGxvd2VyIHByZXZlbnRhYmxlIG1vcnRhbGl0eSwgT09QIGNvc3RzIGFuZCBwcmVtaXVtIGdyb3d0aCkKCl9fRmlndXJlIDlfXwoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiMjIFBMT1QgOTogREFUQSBUQUJMRSBSQU5LSU5HIFRIRSBTVEFURVMgT04gVkFSSU9VUyBNRUFTVVJFUwpkYXRhdGFibGUoZGF0YV90YWJsZV9yYW5rLCByb3duYW1lcyA9IEZBTFNFLCBjb2xuYW1lcyA9IGMoIlN0YXRlIiwgIlBlcmNlbnRhZ2UgSW5zdXJlZCIsICJGZXdlciBQcmV2ZW50YWJsZSBEZWF0aHMiLCAiVXN1YWwgQ2FyZSBBY2Nlc3MiLCAiT09QIENvbnRhaW5lZCIsICJMb3dlciBBbm51YWwgUHJlbWl1bSBHcm93dGgiKSwgY2FwdGlvbiA9ICJSYW5rIG9mIHRoZSA1MCBTdGF0ZXMgaW4gSW5zdXJhbmNlIENvdmVyYWdlIGFuZCBIZWFsdGggT3V0Y29tZXMiKQpgYGAKCiMgKDQpIFBlcmNlcHRpb25zIG9mIEFDQSAoVGV4dCBBbmFseXNpcykKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCB0aWR5PVRSVUV9CmxpYnJhcnkodG0pCmxpYnJhcnkodG0ucGx1Z2luLmxleGlzbmV4aXMpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGd0b29scykgICMgZm9yIHNtYXJ0YmluZApsaWJyYXJ5KGRwbHlyKSAgICMgZm9yIGRhdGFfZnJhbWUKbGlicmFyeShsdWJyaWRhdGUpICAgIyBmb3IgZGF0ZSBmb3JtYXR0aW5nCmxpYnJhcnkoc3RyaW5ncikgIApsaWJyYXJ5KHRvb2xzKSAgIyBUaXRsZSBjYXNlCmxpYnJhcnkocXVhbnRlZGEpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShxdWFudGVkYSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHFkYXApCmxpYnJhcnkoU25vd2JhbGxDKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KHdvcmRjbG91ZCkKCiMgQ29tYmluZSBDU1YgYW5kIEhUTUwgRmlsZXMKZGF0YSA8LSByZWFkX2V4Y2VsKCJMZXhpc05leGlzL05ZVGltZXNfTWV0YWRhdGEueGxzeCIpCmNvbG5hbWVzKGRhdGEpIDwtIHRvbG93ZXIoY29sbmFtZXMoZGF0YSkpCgojIENvcnJlY3QgZGF0YQpkYXRhJGRhdGUgPC0gc3Vic3RyKHBhcnNlX2RhdGVfdGltZShkYXRhJGRhdGUsIGMoIm1keSIpKSwxLDEwKQpkYXRhJGF1dGhvciA8LSB0b1RpdGxlQ2FzZSh0b2xvd2VyKGRhdGEkYnlsaW5lKSkKZGF0YSRieWxpbmUgPC0gTlVMTAoKIyMgR2V0IFRleHQgZmlsZXMKc291cmNlMSA8LSBMZXhpc05leGlzU291cmNlKCJMZXhpc05leGlzL1RoZV9OZXdfWW9yazEuaHRtbCIpCnNvdXJjZTIgPC0gTGV4aXNOZXhpc1NvdXJjZSgiTGV4aXNOZXhpcy9UaGVfTmV3X1lvcmsyLmh0bWwiKQoKY29ycHVzMSA8LSBDb3JwdXMoc291cmNlMSwgcmVhZGVyQ29udHJvbCA9IGxpc3QobGFuZ3VhZ2UgPSBOQSkpCmNvcnB1czIgPC0gQ29ycHVzKHNvdXJjZTIsIHJlYWRlckNvbnRyb2wgPSBsaXN0KGxhbmd1YWdlID0gTkEpKQoKY29ycHVzIDwtIGMoY29ycHVzMSwgY29ycHVzMikKCiMgQ29udmVydCB0byBxdWFudGVkYSBjb3JwdXMKY29ycHVzIDwtIHF1YW50ZWRhOjpjb3JwdXMoY29ycHVzKQoKIyMgQWRkIE1ldGFkYXRhCiMgQ2hlY2s6IG1hdGNoKGRhdGEkaGVhZGxpbmUsIGNvcnB1cyRkb2N1bWVudHMkaGVhZGluZykKY29ycHVzJGRvY3VtZW50cyRkYXRldGltZXN0YW1wIDwtIHN1YnN0cmluZyhjb3JwdXMkZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAsIDEsNCkKY29ycHVzJGRvY3VtZW50cyRkYXRlIDwtIGNvcnB1cyRkb2N1bWVudHMkZGF0ZXRpbWVzdGFtcApjb3JwdXMkZG9jdW1lbnRzJGRlc2NyaXB0aW9uIDwtIGNvcnB1cyRkb2N1bWVudHMkaWQKCiMgb3B0aW9ucyh3aWR0aCA9IDIwMCkKIyBrd2ljKGNvcnB1cywgIlRydW1wIikKIyAKc2F2ZShjb3JwdXMsIGZpbGU9Im55dGltZXMucmRhIikKYGBgCiNUd2l0dGVyIEFQSSBTZW50aW1lbnQvVGV4dCBBbmFseXNpcwotLS0KR2V0IHNvbWUgdHdlZXRzIGZyb20gVHdpdHRlciB0byBhbmFseXplIGFuZCB2aXN1YWxpemUKU2V0IHVwIFR3aXR0ZXIgQVBJOiBTZWxlY3RpbmcgZGF0YSBpbmNsdWRpbmcgT2JhbWFjYXJlLCBBQ0EsIEFmZm9yZGFibGUgQ2FyZSBBY3QsIGFuZCAjQUNBIChuPTEwMDApCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGh0dHIpCiNsaWJyYXJ5KG9hdXRoKQpsaWJyYXJ5KFJPQXV0aCkKbGlicmFyeSh0d2l0dGVSKQpsaWJyYXJ5KFJDdXJsKQpsaWJyYXJ5KFJKU09OSU8pCmxpYnJhcnkoc3RyaW5ncikKI3NlY3JldGtleQojbXlhcHAgPC0gb2F1dGhfYXBwKCJ0d2l0dGVyIiwKICAgICAgICAgICAgICAgICAgIyBrZXkgPSAibGlMbjZYSkZlbkdqdHZXRndpNUxuRFMxTSIsCiAgICAgICAgICAgICAgICAgICMgc2VjcmV0ID0gImRzQ0JtOUt5YWV1OUdNS2xNOXh3S2w3ZUttRG42cXNqUDMxTFF0d01Ha0Y2T1FkTGg2IikKI0dldCBPQXV0aCBjcmVkZW50aWFscwojdHdpdHRlcl90b2tlbiA8LSBvYXV0aDEuMF90b2tlbihvYXV0aF9lbmRwb2ludHMoInR3aXR0ZXIiKSwgbXlhcHApCgojIERlY2xhcmUgVHdpdHRlciBBUEkgQ3JlZGVudGlhbHMKYXBpX2tleSA8LSAibGlMbjZYSkZlbkdqdHZXRndpNUxuRFMxTSIgIyBGcm9tIGRldi50d2l0dGVyLmNvbQphcGlfc2VjcmV0IDwtICJkc0NCbTlLeWFldTlHTUtsTTl4d0tsN2VLbURuNnFzalAzMUxRdHdNR2tGNk9RZExoNiIgIyBGcm9tIGRldi50d2l0dGVyLmNvbQp0b2tlbiA8LSAiNzcyMTc2ODExNDU1MzgxNTA1LVBZdU5BRXFoSEZjMDJyODNXUzlZNWRuc1pjaUlZNXYiICMgRnJvbSBkZXYudHdpdHRlci5jb20KdG9rZW5fc2VjcmV0IDwtICJtZ1JQd0tlSFpFdzlZNDg2aDJHTXRDQnhEenRQZlFMWDFNc2Q1dm9nMWhpd3YiICMgRnJvbSBkZXYudHdpdHRlci5jb20KCiMgQ3JlYXRlIFR3aXR0ZXIgQ29ubmVjdGlvbgpsaWJyYXJ5KCJiYXNlNjRlbmMiKQpzZXR1cF90d2l0dGVyX29hdXRoKGFwaV9rZXksIGFwaV9zZWNyZXQsIHRva2VuLCB0b2tlbl9zZWNyZXQpCgojIFJ1biBUd2l0dGVyIFNlYXJjaC4gRm9ybWF0IGlzIHNlYXJjaFR3aXR0ZXIoIlNlYXJjaCBUZXJtcyIsIG49MTAwLCBsYW5nPSJlbiIsIGdlb2NvZGU9ImxhdCxsbmciLCBhbHNvIGFjY2VwdHMgc2luY2UgYW5kIHVudGlsKS4KCnR3ZWV0cyA8LSBzZWFyY2hUd2l0dGVyKCJPYmFtYWNhcmUgT1IgQUNBIE9SICdBZmZvcmRhYmxlIENhcmUgQWN0JyBPUiAjQUNBIiwgbj0xMDAwLCBsYW5nPSJlbiIsIHNpbmNlPSIyMDE0LTA4LTIwIikKCiMgVHJhbnNmb3JtIHR3ZWV0cyBsaXN0IGludG8gYSBkYXRhIGZyYW1lCnR3ZWV0cy5kZiA8LSB0d0xpc3RUb0RGKHR3ZWV0cykKaGVhZCh0d2VldHMuZGYsMykKYGBgCgpXaG8gd2FzIHR3ZWV0aW5nIG1vc3QgaW4gdGhlIHNhbXBsZSB3ZSBjb2xsZWN0ZWQKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmNvdW50cz10YWJsZSh0d2VldHMuZGYkc2NyZWVuTmFtZSkKYmFycGxvdChjb3VudHMpCiMgTGV0J3MgZG8gc29tZXRoaW5nIGhhY2t5OgojIExpbWl0IHRoZSBkYXRhIHNldCB0byBzaG93IG9ubHkgZm9sayB3aG8gdHdlZXRlZCB0d2ljZSBvciBtb3JlIGluIHRoZSBzYW1wbGUKY2M9c3Vic2V0KGNvdW50cyxjb3VudHM+MSkKYmFycGxvdChjYyxsYXM9MixjZXgubmFtZXMgPTAuMykKYGBgCgpMZXQncyBoYXZlIGEgZ28gYXQgcGFyc2luZyBzb21lIHR3ZWV0cywgcHVsbGluZyBvdXQgdGhlIG5hbWVzIG9mIGZvbGsgd2hvIGhhdmUgYmVlbiByZXR3ZWV0ZWQgb3IgCndobyBoYXZlIGhhZCBhIHR3ZWV0IHNlbnQgdG8gdGhlbToKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnR3ZWV0cy5kZiR0ZXh0PXNhcHBseSh0d2VldHMuZGYkdGV4dCxmdW5jdGlvbihyb3cpIGljb252KHJvdyx0bz0nVVRGLTgnKSkKIAojQSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIEAgc3ltYm9scyBmcm9tIHVzZXIgbmFtZXMuLi4KdHJpbSA8LSBmdW5jdGlvbiAoeCkgc3ViKCdAJywnJyx4KQoKI0EgY291cGxlIG9mIHR3ZWV0IHBhcnNpbmcgZnVuY3Rpb25zIHRoYXQgYWRkIGNvbHVtbnMgdG8gdGhlIGRhdGFmcmFtZQpsaWJyYXJ5KHN0cmluZ3IpCiNQdWxsIG91dCB3aG8gYSBtZXNzYWdlIGlzIHRvCnR3ZWV0cy5kZiR0bz1zYXBwbHkodHdlZXRzLmRmJHRleHQsZnVuY3Rpb24odHdlZXQpIHN0cl9leHRyYWN0KHR3ZWV0LCJeKEBbWzphbG51bTpdX10qKSIpKQp0d2VldHMuZGYkdG89c2FwcGx5KHR3ZWV0cy5kZiR0byxmdW5jdGlvbihuYW1lKSB0cmltKG5hbWUpKQoKI0FuZCBoZXJlJ3MgYSB3YXkgb2YgZ3JhYmJpbmcgd2hvJ3MgYmVlbiBSVCdkCnR3ZWV0cy5kZiRydD1zYXBwbHkodHdlZXRzLmRmJHRleHQsZnVuY3Rpb24odHdlZXQpIHRyaW0oc3RyX21hdGNoKHR3ZWV0LCJeUlQgKEBbWzphbG51bTpdX10qKSIpWzJdKSkKCiNub3cgd2UgY2FuIHBsb3QgYSBjaGFydCBzaG93aW5nIGhvdyBvZnRlbiBhIHBhcnRpY3VsYXIgcGVyc29uIHdhcyBSVCdkIGluIG91ciBzYW1wbGUuCmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KCkrZ2VvbV9iYXIoYWVzKHg9bmEub21pdCh0d2VldHMuZGYkcnQpKSkKYGBgCgoKX19maWd1cmUgMTBfX18KCkV4dHJhY3RpbmcgdGhlIHNvdXJjZSBhcHBsaWNhdGlvbi4gKFdlJ3JlIGxvb2tpbmcgb25seSBhdCB0aGUgaVBob25lIGFuZCBBbmRyb2lkIHR3ZWV0cy0gYSBtdWNoIHNtYWxsZXIgbnVtYmVyIGFyZSBmcm9tIHRoZSB3ZWIgY2xpZW50IG9yIGlQYWQpLgpPdmVyYWxsLCB0aGlzIGluY2x1ZGVzIDM4OCB0d2VldHMgZnJvbSBpUGhvbmUsIGFuZCAyNTYgdHdlZXRzIGZyb20gQW5kcm9pZC4gT25lIGNvbnNpZGVyYXRpb24gaXMgd2hhdCB0aW1lIG9mIGRheSB0aGUgdHdlZXRzIG9jY3VyLCB3aGljaCB3ZSdkIGV4cGVjdCB0byBiZSBhICJzaWduYXR1cmUiIG9mIHRoZWlyIHVzZXIuIEhlcmUgd2UgY2FuIGNlcnRhaW5seSBzcG90IGEgZGlmZmVyZW5jZToKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocHVycnIpCnR3ZWV0cyA8LSB0d2VldHMuZGYgJT4lCiAgc2VsZWN0KGlkLCBzdGF0dXNTb3VyY2UsIHRleHQsIGNyZWF0ZWQpICU+JQogIGV4dHJhY3Qoc3RhdHVzU291cmNlLCAic291cmNlIiwgIlR3aXR0ZXIgZm9yICguKj8pPCIpICU+JQogIGZpbHRlcihzb3VyY2UgJWluJSBjKCJpUGhvbmUiLCAiQW5kcm9pZCIpKQp0YWJsZSh0d2VldHMkc291cmNlKQoKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoc2NhbGVzKQp0d2VldHMgJT4lCiAgY291bnQoc291cmNlLCBtaW51dGUgPSBtaW51dGUod2l0aF90eihjcmVhdGVkLCAiRVNUIikpKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IG4gLyBzdW0obikpICU+JQogIGdncGxvdChhZXMobWludXRlLCBwZXJjZW50LCBjb2xvciA9IHNvdXJjZSkpICsKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KCkpICsKICBsYWJzKHggPSAiTWludXRlIG9mIGRheSAoRVNUKSIsCiAgICAgICB5ID0gIiUgb2YgdHdlZXRzIiwKICAgICAgIGNvbG9yID0gIiIpCmBgYAoKCl9fZmlndXJlIDExX19fCkluIHRoZSByZW1haW5pbmcgYnktd29yZCBhbmFseXNlcyBpbiB0aGlzIHRleHQsIHdlIGZpbHRlciB0aGVzZSBxdW90ZWQgdHdlZXRzIG91dCAoc2luY2UgdGhleSBjb250YWluIHRleHQgZnJvbSBmb2xsb3dlcnMgdGhhdCBtYXkgbm90IGJlIHJlcHJlc2VudGF0aXZlIG9mIG9yaWdpbmFsIHR3ZWV0cy4gU29tZXdoZXJlIGVsc2Ugd2UgY2FuIHNlZSBhIGRpZmZlcmVuY2UgaW52b2x2ZXMgc2hhcmluZyBsaW5rcyBvciBwaWN0dXJlcyBpbiB0d2VldHMuCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQp0d2VldF9waWN0dXJlX2NvdW50cyA8LSB0d2VldHMgJT4lCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KHRleHQsICdeIicpKSAlPiUKICBjb3VudChzb3VyY2UsCiAgICAgICAgcGljdHVyZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRleHQsICJ0LmNvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAiUGljdHVyZS9saW5rIiwgIk5vIHBpY3R1cmUvbGluayIpKQoKZ2dwbG90KHR3ZWV0X3BpY3R1cmVfY291bnRzLCBhZXMoc291cmNlLCBuLCBmaWxsID0gcGljdHVyZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiTnVtYmVyIG9mIHR3ZWV0cyIsIGZpbGwgPSAiIikKYGBgCgoKX19maWd1cmUgMTJfX18KQ29tcGFyaXNvbiBvZiB3b3JkcwpOb3cgdGhhdCB3ZSdyZSBzdXJlIHRoZXJlJ3MgYSBkaWZmZXJlbmNlLCB3aGF0IGNhbiB3ZSBzYXkgYWJvdXQgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIGNvbnRlbnQ/IFdlJ2xsIHVzZSB0aGUgdGlkeXRleHQgcGFja2FnZS4gV2Ugc3RhcnQgYnkgZGl2aWRpbmcgaW50byBpbmRpdmlkdWFsIHdvcmRzIHVzaW5nIHRoZSB1bm5lc3RfdG9rZW5zIGZ1bmN0aW9uLCBhbmQgcmVtb3Zpbmcgc29tZSBjb21tb24gc3RvcHdvcmRzLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXRleHQpCgpyZWcgPC0gIihbXkEtWmEtelxcZCNAJ118Jyg/IVtBLVphLXpcXGQjQF0pKSIKdHdlZXRfd29yZHMgPC0gdHdlZXRzICU+JQogIGZpbHRlcighc3RyX2RldGVjdCh0ZXh0LCAnXiInKSkgJT4lCiAgbXV0YXRlKHRleHQgPSBzdHJfcmVwbGFjZV9hbGwodGV4dCwgImh0dHBzOi8vdC5jby9bQS1aYS16XFxkXSt8JmFtcDsiLCAiIikpICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCwgdG9rZW4gPSAicmVnZXgiLCBwYXR0ZXJuID0gcmVnKSAlPiUKICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wX3dvcmRzJHdvcmQsCiAgICAgICAgIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIikpCgpsaWJyYXJ5KHFkYXApCiMgRmluZCB0aGUgMjAgbW9zdCBmcmVxdWVudCB0ZXJtczogdGVybV9jb3VudAp0ZXJtX2NvdW50MSA8LSBmcmVxX3Rlcm1zKHR3ZWV0X3dvcmRzJHdvcmQsMjApCiMgUGxvdCB0ZXJtX2NvdW50CnBsb3QodGVybV9jb3VudDEpCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmFuZHJvaWRfaXBob25lX3JhdGlvcyA8LSB0d2VldF93b3JkcyAlPiUKICBjb3VudCh3b3JkLCBzb3VyY2UpICU+JQogIGZpbHRlcihzdW0obikgPj0gNSkgJT4lCiAgc3ByZWFkKHNvdXJjZSwgbiwgZmlsbCA9IDApICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGVfZWFjaChmdW5zKCguICsgMSkgLyBzdW0oLiArIDEpKSwgLXdvcmQpICU+JQogIG11dGF0ZShsb2dyYXRpbyA9IGxvZzIoQW5kcm9pZCAvIGlQaG9uZSkpICU+JQogIGFycmFuZ2UoZGVzYyhsb2dyYXRpbykpCmxpYnJhcnkoZ2d0aGVtZXMpCmdncGxvdChkYXRhPWFuZHJvaWRfaXBob25lX3JhdGlvcywgYWVzKHggPSB3b3JkLCB5ID0gbG9ncmF0aW8pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgI2dlb21fdGV4dChhZXMobGFiZWw9cHJlcywgLCB5PTAuMDA1KSwgY29sb3I9IndoaXRlIikgKwogIHhsYWIoTlVMTCkgKyAgY29vcmRfZmxpcCgpICsgdGhlbWVfdHVmdGUoKQoKZ2dwbG90KGRhdGE9YW5kcm9pZF9pcGhvbmVfcmF0aW9zLCBhZXMoeCA9IHdvcmQsIHkgPSBBbmRyb2lkKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogICNnZW9tX3RleHQobGFiZWw9IEFuZHJvaWQsIGNvbG9yPSJyZWQiKSArCiAgeGxhYihOVUxMKSArICBjb29yZF9mbGlwKCkgKyB0aGVtZV90dWZ0ZSgpCgpnZ3Bsb3QoZGF0YT1hbmRyb2lkX2lwaG9uZV9yYXRpb3MsIGFlcyh4ID0gd29yZCwgeT1pUGhvbmUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgI2dlb21fdGV4dChsYWJlbD0gQW5kcm9pZCwgY29sb3I9InJlZCIpICsKICB4bGFiKE5VTEwpICsgIGNvb3JkX2ZsaXAoKSArIHRoZW1lX3R1ZnRlKCkKYGBgCgpTZW50aW1lbnQgYW5hbHlzaXM6ClNpbmNlIHdlJ3ZlIG9ic2VydmVkIGEgZGlmZmVyZW5jZSBpbiBzZW50aW1lbnQgYmV0d2VlbiB0aGUgQW5kcm9pZCBhbmQgaVBob25lIHR3ZWV0cywgbGV0J3MgdHJ5IHF1YW50aWZ5aW5nIGl0LiBXZSdsbCB3b3JrIHdpdGggdGhlIE5SQyBXb3JkLUVtb3Rpb24gQXNzb2NpYXRpb24gbGV4aWNvbiwgYXZhaWxhYmxlIGZyb20gdGhlIHRpZHl0ZXh0IHBhY2thZ2UsIHdoaWNoIGFzc29jaWF0ZXMgd29yZHMgd2l0aCAxMCBzZW50aW1lbnRzOiBwb3NpdGl2ZSwgbmVnYXRpdmUsIGFuZ2VyLCBhbnRpY2lwYXRpb24sIGRpc2d1c3QsIGZlYXIsIGpveSwgc2FkbmVzcywgc3VycHJpc2UsIGFuZCB0cnVzdC4KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9Cm5yYyA8LSBzZW50aW1lbnRzICU+JQogIGZpbHRlcihsZXhpY29uID09ICJucmMiKSAlPiUKICBkcGx5cjo6c2VsZWN0KHdvcmQsIHNlbnRpbWVudCkKYGBgCgoKVG8gbWVhc3VyZSB0aGUgc2VudGltZW50IG9mIHRoZSBBbmRyb2lkIGFuZCBpUGhvbmUgdHdlZXRzLCB3ZSBjYW4gY291bnQgdGhlIG51bWJlciBvZiB3b3JkcyBpbiBlYWNoIGNhdGVnb3J5LiAoRm9yIGV4YW1wbGUsIHdlIHNlZSB0aGF0IDQxIG9mIHRoZSAyMzMxIHdvcmRzIGluIHRoZSBBbmRyb2lkIHR3ZWV0cyB3ZXJlIGFzc29jaWF0ZWQgd2l0aCAiYW5nZXIiKS4gV2UgdGhlbiB3YW50IHRvIG1lYXN1cmUgaG93IG11Y2ggbW9yZSBsaWtlbHkgdGhlIEFuZHJvaWQgYWNjb3VudCBpcyB0byB1c2UgYW4gZW1vdGlvbmFsbHktY2hhcmdlZCB0ZXJtIHJlbGF0aXZlIHRvIHRoZSBpUGhvbmUgYWNjb3VudC4gU2luY2UgdGhpcyBpcyBjb3VudCBkYXRhLCB3ZSBjYW4gdXNlIGEgUG9pc3NvbiB0ZXN0IHRvIG1lYXN1cmUgdGhlIGRpZmZlcmVuY2U6CmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQpzb3VyY2VzIDwtIHR3ZWV0X3dvcmRzICU+JQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lCiAgbXV0YXRlKHRvdGFsX3dvcmRzID0gbigpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZGlzdGluY3QoaWQsIHNvdXJjZSwgdG90YWxfd29yZHMpCgpieV9zb3VyY2Vfc2VudGltZW50IDwtIHR3ZWV0X3dvcmRzICU+JQogIGlubmVyX2pvaW4obnJjLCBieSA9ICJ3b3JkIikgJT4lCiAgY291bnQoc2VudGltZW50LCBpZCkgJT4lCiAgdW5ncm91cCgpICU+JQogIGNvbXBsZXRlKHNlbnRpbWVudCwgaWQsIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgaW5uZXJfam9pbihzb3VyY2VzKSAlPiUKICBncm91cF9ieShzb3VyY2UsIHNlbnRpbWVudCwgdG90YWxfd29yZHMpICU+JQogIHN1bW1hcml6ZSh3b3JkcyA9IHN1bShuKSkgJT4lCiAgdW5ncm91cCgpCgpoZWFkKGJ5X3NvdXJjZV9zZW50aW1lbnQpCmBgYAoKX19maWd1cmUgMTNfX18KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CmxpYnJhcnkoYnJvb20pCgpzZW50aW1lbnRfZGlmZmVyZW5jZXMgPC0gYnlfc291cmNlX3NlbnRpbWVudCAlPiUKICBncm91cF9ieShzZW50aW1lbnQpICU+JQogIGRvKHRpZHkocG9pc3Nvbi50ZXN0KC4kd29yZHMsIC4kdG90YWxfd29yZHMpKSkKCnNlbnRpbWVudF9kaWZmZXJlbmNlcwoKI2xpYnJhcnkocmVzaGFwZTIpCiNkZi5sb25nIDwtIG1lbHQoYnlfc291cmNlX3NlbnRpbWVudCkKI2RmLmxvbmcgPC0gZGYubG9uZ1syMTo0MCxdCmdncGxvdChieV9zb3VyY2Vfc2VudGltZW50LCBhZXMoeCA9IHNlbnRpbWVudCwgeSA9IHdvcmRzKSkgKwogIGdlb21fYmFyKGFlcyhmaWxsPXNvdXJjZSksIHN0YXQgPSAiaWRlbnRpdHkiLHBvc2l0aW9uPSJkb2RnZSIpICsgCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSArCiAgeGxhYihOVUxMKSArICBjb29yZF9mbGlwKCkgKyB0aGVtZV90dWZ0ZSgpCmBgYAoKRGF0YSBQcmVwYXJhdGlvbiB1c2luZyBUd2l0dGVyOiAKVGhlIFR3aXR0ZXIgc2VhcmNoIEFQSSBkb2VzIG5vdCByZXR1cm4gYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIHR3ZWV0cyB0aGF0IG1hdGNoIHlvdXIgc2VhcmNoIGNyaXRlcmlhLCBhcyBUd2l0dGVyIG9ubHkgbWFrZXMgYXZhaWxhYmxlIGEgc2FtcGxlIG9mIHJlY2VudCB0d2VldHMuIEZvciBhIG1vcmUgY29tcHJlaGVuc2l2ZSBzZWFyY2gsIHdlIHdpbGwgbmVlZCB0byB1c2UgdGhlIFR3aXR0ZXIgc3RyZWFtaW5nIEFQSSwgY3JlYXRpbmcgYSBkYXRhYmFzZSBvZiByZXN1bHRzIGFuZCByZWd1bGFybHkgdXBkYXRpbmcgdGhlbSwgb3IgdXNlIGFuIG9ubGluZSBzZXJ2aWNlIHRoYXQgY2FuIGRvIHRoaXMuCk5vdyB0aGF0IHdlIGhhdmUgdHdlZXQgdGV4dHMsIHdlIG5lZWQgdG8gY2xlYW4gdGhlbSB1cCBiZWZvcmUgZG9pbmcgYW55IGFuYWx5c2lzLiBUaGlzIGludm9sdmVzIHJlbW92aW5nIGNvbnRlbnQsIHN1Y2ggYXMgcHVuY3R1YXRpb24sIHRoYXQgaGFzIG5vIGVtb3Rpb25hbCBjb250ZW50LCBhbmQgcmVtb3ZpbmcgYW55IGNvbnRlbnQgdGhhdCBjYXVzZXMgZXJyb3JzLgoKClRleHQgQ2xlYW5pbmcKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CmxpYnJhcnkodG0pCiMgYnVpbGQgYSBjb3JwdXMsIGFuZCBzcGVjaWZ5IHRoZSBzb3VyY2UgdG8gYmUgY2hhcmFjdGVyIHZlY3RvcnMKbXlDb3JwdXMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZSh0d2VldHMuZGYkdGV4dCkpCiMgY29udmVydCB0byBsb3dlciBjYXNlCiMgdG0gdjAuNgpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpCiMgdG0gdjAuNS0xMAojIG15Q29ycHVzIDwtIHRtX21hcChteUNvcnB1cywgdG9sb3dlcikKIyByZW1vdmUgVVJMcwpyZW1vdmVVUkwgPC0gZnVuY3Rpb24oeCkgZ3N1YigiaHR0cFteWzpzcGFjZTpdXSoiLCAiIiwgeCkKIyB0bSB2MC42Cm15Q29ycHVzIDwtIHRtX21hcChteUNvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVVUkwpKQojIHRtIHYwLjUtMTAKIyBteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHJlbW92ZVVSTCkKIyByZW1vdmUgYW55dGhpbmcgb3RoZXIgdGhhbiBFbmdsaXNoIGxldHRlcnMgb3Igc3BhY2UKcmVtb3ZlTnVtUHVuY3QgPC0gZnVuY3Rpb24oeCkgZ3N1YigiW15bOmFscGhhOl1bOnNwYWNlOl1dKiIsICIiLCB4KQpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlTnVtUHVuY3QpKQojIHJlbW92ZSBwdW5jdHVhdGlvbgojIG15Q29ycHVzIDwtIHRtX21hcChteUNvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pCiMgcmVtb3ZlIG51bWJlcnMKIyBteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHJlbW92ZU51bWJlcnMpCiMgYWRkIHR3byBleHRyYSBzdG9wIHdvcmRzOiAiYXZhaWxhYmxlIiBhbmQgInZpYSIKbXlTdG9wd29yZHMgPC0gYyhzdG9wd29yZHMoJ2VuZ2xpc2gnKSwgImF2YWlsYWJsZSIsICJ2aWEiKQojIHJlbW92ZSAiciIgYW5kICJiaWciIGZyb20gc3RvcHdvcmRzCm15U3RvcHdvcmRzIDwtIHNldGRpZmYobXlTdG9wd29yZHMsIGMoInIiLCAiYmlnIikpCiMgcmVtb3ZlIHN0b3B3b3JkcyBmcm9tIGNvcnB1cwpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHJlbW92ZVdvcmRzLCBteVN0b3B3b3JkcykKIyByZW1vdmUgZXh0cmEgd2hpdGVzcGFjZQpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHN0cmlwV2hpdGVzcGFjZSkKIyBrZWVwIGEgY29weSBvZiBjb3JwdXMgdG8gdXNlIGxhdGVyIGFzIGEgZGljdGlvbmFyeSBmb3Igc3RlbSBjb21wbGV0aW9uCm15Q29ycHVzQ29weSA8LSBteUNvcnB1cwojIHN0ZW0gd29yZHMKbXlDb3JwdXMgPC0gdG1fbWFwKG15Q29ycHVzLCBzdGVtRG9jdW1lbnQpCiMgaW5zcGVjdCB0aGUgZmlyc3QgNSBkb2N1bWVudHMgKHR3ZWV0cykKIyBpbnNwZWN0KG15Q29ycHVzWzE6NV0pCiMgVGhlIGNvZGUgYmVsb3cgaXMgdXNlZCBmb3IgdG8gbWFrZSB0ZXh0IGZpdCBmb3IgcGFwZXIgd2lkdGgKZm9yIChpIGluIGMoMToyLCAzMjApKSB7CmNhdChwYXN0ZTAoIlsiLCBpLCAiXSAiKSkKd3JpdGVMaW5lcyhzdHJ3cmFwKGFzLmNoYXJhY3RlcihteUNvcnB1c1tbaV1dKSwgNjApKQp9CiMjIFsxXSBleGFtcGwgY2FsbCBqYXZhIGNvZGUgcgojIyBbMl0gc2ltdWwgbWFwcmVkdWMgciBiaWcgZGF0YSBhbmFseXNpIHVzZSBmbGlnaHQgZGF0YSByYmxvZ2dlcgojIyBbMzIwXSByIHJlZmVyIGNhcmQgZGF0YSBtaW5lIG5vdyBjcmFuIGxpc3QgbWFuaSB1c2UgciBmdW5jdGlvbgojIyBwYWNrYWcgZGF0YSBtaW5lIGFwcGxpYwojIHRtIHYwLjUtMTAKIyBteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIHN0ZW1Db21wbGV0aW9uKQojIHRtIHYwLjYKc3RlbUNvbXBsZXRpb24yIDwtIGZ1bmN0aW9uKHgsIGRpY3Rpb25hcnkpIHsKeCA8LSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiICIpKQojIFVuZXhwZWN0ZWRseSwgc3RlbUNvbXBsZXRpb24gY29tcGxldGVzIGFuIGVtcHR5IHN0cmluZyB0bwojIGEgd29yZCBpbiBkaWN0aW9uYXJ5LiBSZW1vdmUgZW1wdHkgc3RyaW5nIHRvIGF2b2lkIGFib3ZlIGlzc3VlLgp4IDwtIHhbeCAhPSAiIl0KeCA8LSBzdGVtQ29tcGxldGlvbih4LCBkaWN0aW9uYXJ5PWRpY3Rpb25hcnkpCnggPC0gcGFzdGUoeCwgc2VwPSIiLCBjb2xsYXBzZT0iICIpClBsYWluVGV4dERvY3VtZW50KHN0cmlwV2hpdGVzcGFjZSh4KSkKfQojbXlDb3JwdXMgPC0gbGFwcGx5KG15Q29ycHVzLCBzdGVtQ29tcGxldGlvbjIsIGRpY3Rpb25hcnk9bXlDb3JwdXNDb3B5KQpteUNvcnB1cyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKG15Q29ycHVzKSkKCiMgY291bnQgZnJlcXVlbmN5IG9mICJtaW5pbmciCm1pbmluZ0Nhc2VzIDwtIGxhcHBseShteUNvcnB1c0NvcHksCmZ1bmN0aW9uKHgpIHsgZ3JlcChhcy5jaGFyYWN0ZXIoeCksIHBhdHRlcm4gPSAiXFw8bWluaW5nIil9ICkKc3VtKHVubGlzdChtaW5pbmdDYXNlcykpCiMjIFsxXSA4MgojIGNvdW50IGZyZXF1ZW5jeSBvZiAibWluZXIiCm1pbmVyQ2FzZXMgPC0gbGFwcGx5KG15Q29ycHVzQ29weSwKZnVuY3Rpb24oeCkge2dyZXAoYXMuY2hhcmFjdGVyKHgpLCBwYXR0ZXJuID0gIlxcPG1pbmVyIil9ICkKc3VtKHVubGlzdChtaW5lckNhc2VzKSkKIyMgWzFdIDUKIyByZXBsYWNlICJtaW5lciIgd2l0aCAibWluaW5nIgpteUNvcnB1cyA8LSB0bV9tYXAobXlDb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIoZ3N1YiksCnBhdHRlcm4gPSAibWluZXIiLCByZXBsYWNlbWVudCA9ICJtaW5pbmciKQoKdGRtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChteUNvcnB1cywKY29udHJvbCA9IGxpc3Qod29yZExlbmd0aHMgPSBjKDEsIEluZikpKQp0ZG0KIyMgPDxUZXJtRG9jdW1lbnRNYXRyaXggKHRlcm1zOiA4MjIsIGRvY3VtZW50czogMzIwKT4+CiMjIE5vbi0vc3BhcnNlIGVudHJpZXM6IDI0NjAvMjYwNTgwCiMjIFNwYXJzaXR5IDogOTklCiMjIE1heGltYWwgdGVybSBsZW5ndGg6IDI3CiMjIFdlaWdodGluZyA6IHRlcm0gZnJlcXVlbmN5ICh0ZikKYGBgCgpfX2ZpZ3VyZSAxNF9fXwpGcmVxdWVudCBXb3JkcyBhbmQgQXNzb2NpYXRpb25zCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQp0ZXJtLmZyZXEgPC0gcm93U3Vtcyhhcy5tYXRyaXgodGRtKSkKdGVybS5mcmVxIDwtIHN1YnNldCh0ZXJtLmZyZXEsIHRlcm0uZnJlcSA+PSAxNSkKZGYgPC0gZGF0YS5mcmFtZSh0ZXJtID0gbmFtZXModGVybS5mcmVxKSwgZnJlcSA9IHRlcm0uZnJlcSkKbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdGVybSwgeSA9IGZyZXEpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCnhsYWIoIlRlcm1zIikgKyB5bGFiKCJDb3VudCIpICsgY29vcmRfZmxpcCgpCgpgYGAKCl9fZmlndXJlIDE1X19fCldvcmQgQ2xvdWQKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CiNsaWJyYXJ5KGdyYXBoKQojc291cmNlKCJodHRwOi8vYmlvY29uZHVjdG9yLm9yZy9iaW9jTGl0ZS5SIikKI2Jpb2NMaXRlKCJSZ3JhcGh2aXoiKQojbGlicmFyeSgiUmdyYXBodml6IikKI3Bsb3QodGRtLCB0ZXJtID0gdGVybS5mcmVxLCBjb3JUaHJlc2hvbGQgPSAwLjIsIHdlaWdodGluZyA9IFQpCgptIDwtIGFzLm1hdHJpeCh0ZG0pCiMgY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgb2Ygd29yZHMgYW5kIHNvcnQgaXQgYnkgZnJlcXVlbmN5CndvcmQuZnJlcSA8LSBzb3J0KHJvd1N1bXMobSksIGRlY3JlYXNpbmcgPSBUKQojIGNvbG9ycwpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcGFsIDwtIGJyZXdlci5wYWwoOSwgIkJ1R24iKQpwYWwgPC0gcGFsWy0oMTo0KV0KCiMgcGxvdCB3b3JkIGNsb3VkCmxpYnJhcnkod29yZGNsb3VkKQp3b3JkY2xvdWQod29yZHMgPSBuYW1lcyh3b3JkLmZyZXEpLCBmcmVxID0gd29yZC5mcmVxLCBtaW4uZnJlcSA9IDMsCnJhbmRvbS5vcmRlciA9IEYsIGNvbG9ycyA9IHBhbCkKCmBgYAoKX19GaWd1cmUgMTZfXwoKVG9waWMgTW9kZWxsaW5nCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQppbnN0YWxsLnBhY2thZ2VzKCJ0b3BpY21vZGVscyIpCmR0bSA8LSBhcy5Eb2N1bWVudFRlcm1NYXRyaXgodGRtKQpsaWJyYXJ5KHRvcGljbW9kZWxzKQpsZGEgPC0gTERBKGR0bSwgayA9IDgpICMgZmluZCA4IHRvcGljcwoodGVybSA8LSB0ZXJtcyhsZGEsIDYpKSAjIGZpcnN0IDYgdGVybXMgb2YgZXZlcnkgdG9waWMKCmBgYAoKCiMgVGV4dCBhbmFseXNpczogTWVkaWEgYW5kIHRoZSBBZmZvcmRhYmxlIGNhcmUgYWN0CldlIGFyZSBhbHNvIGludGVyZXN0ZWQgaW4gaG93IHBlb3BsZSB0aGluayBhYm91dCBBZmZvcmRhYmxlIGNhcmUgYWN0KEFDQSkuIFdlIHdhbnQgdG8gaGF2ZSBhIGxvb2sgb2YgdGhlIHR3ZWV0cyBhbmQgbmV3c3BhcGVyIHJlbGF0ZWQgdG8gQUNBLiBUbyByZWFsaXplIHRoaXMsIHdlIHVzZSBBUEkgdG8gZG93bmxvYWQgYXJ0aWNsZXMgcmVhbHRlZCB0byBBQ0Egb24gTmV3IHlvcmsgdGltZXMgZnJvbSAyMDExLTIwMTcgYW5kIHRyYW5zZm9ybSB0aGVtIGludG8gY29ycHVzIHRvIGRvIHRoZSB0ZXh0IGFuYWx5c2lzLgoKX19SZXNlYXJjaCBRdWVzdGlvbnM6X18KMSkgVGhlIG92ZXJsbCB0cmVuZCBvZiBwdWJsdWMgYXR0ZW50aW9uLCB3aGljaCBjYW4gYmUgc2hvd24gYXMgdGhlIG51bWJlciBvZiBhcnRpY2xlcyByZWxhdGVkIHRvIEFDQSBpbiBkaWZmZXJlbnQgeWVhcnMuCjIpIFdoYXQgcGVvcGxlIGRpc2N1c3MgYWJvdXQgd2hlbiB0aGV5IGRpc2N1c3MgQUNBLCB3aGljaCBjYW4gYmUgc2hvd24gYXMgdGhlIHdvcmQgZnJlcXVlbmNpZXMuCgpXZSBjb3VsZCBzZWUgdGhhdCBwZW9wbGUgZGlzY3Vzc2VkIEFDQSBhIGxvdCB3aGVuIG9iYW1hIGZpcnN0IHNpZ25lZCBpdCwgYW5kIHRoZSBlbGVjdGlvbiBpbiAyMDE3IG1hZGUgaXQgYSBob3QgdG9waWMgYWdhaW4uIEFuZCBub3Qgc3VwcmlzaW5nbHksIHBlb3BlbCBhbHdheXMgdGFsayBhYm91dCBUcnVtcCB3aGVuIHRoZXkgdGFsayBhYm91dCBBQ0EKCl9fRmlndXJlIDE3X18KCldlIGNvdWxkIHNlZSB0aGF0IHBlb3BsZSBkaXNjdXNzZWQgQUNBIGEgbG90IHdoZW4gT2JhbWEgZmlyc3Qgc2lnbmVkIGl0LCBhbmQgdGhlIGVsZWN0aW9uIGluIDIwMTcgbWFkZSBpdCBhIGhvdCB0b3BpYyBhZ2Fpbi4gQW5kIG5vdCBzdXByaXNpbmdseSwgcGVvcGxlIGFsd2F5cyB0YWxrIGFib3V0IFRydW1wIHdoZW4gdGhleSB0YWxrIGFib3V0IEFDQS4KCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQpkYXQgPC0gZGF0YS5mcmFtZShkYXRlID1jb3JwdXMkZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAsIGxldmVscz1jKDE6MTAwMCkpCmdncGxvdChkYXRhPWRhdCwgYWVzKHg9ZGF0ZSkpK2dlb21fYmFyKHN0YXQ9ImNvdW50IikrZ2d0aXRsZSgiTnVtYmVyIG9mIEFydGljbGVzIE1lbnRpb25pbmcgQUNBIGJ5IFllYXIiKSt0aGVtZV90dWZ0ZSgpK3lsYWIoIk51bWJlciBvZiBhcnRpY2xlcyIpICsgeGxhYigieWVhciIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3QgPSAwLjUsIHNpemUgPSAxMikpCgpgYGAKCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHRpZHkgPSBUUlVFfQpsb2FkKCJueXRpbWVzLnJkYSIpCmRmbXRvdGFsIDwtIGRmbShjb3JwdXMsIHJlbW92ZSA9IHN0b3B3b3JkcygiZW5nbGlzaCIpLCBzdGVtID0gVFJVRSwgcmVtb3ZlUHVuY3QgPSBUUlVFLCByZW1vdmVOdW1iZXJzID0gVFJVRSwgdG9sb3dlciA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFKQpkZm10b3RhbFssIDE6NV0KaGVhZChzdG9wd29yZHMoImVuZ2xpc2giKSwgMjApCmZyZXE8LXRvcGZlYXR1cmVzKGRmbXRvdGFsLCAyMCkKd2YgPC0gZGF0YS5mcmFtZSh3b3JkPW5hbWVzKGZyZXEpLCBmcmVxPWZyZXEpICAgCmBgYAoKX19GaWd1cmUgMThfXwoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CnAgPC0gZ2dwbG90KHN1YnNldCh3ZiwgZnJlcT41MCksIGFlcyh3b3JkLCBmcmVxKSkgICAgCnAgPC0gcCArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikKcCA8LSBwICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1mcmVxKSwgdmp1c3Q9LTAuMikrIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPSB3ZiR3b3JkKSAgIApwIDwtIHAgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuNSwgc2l6ZSA9IDEyKSkrZ2d0aXRsZSgiV29yZCBGcmVxdWVuY3kgZnJvbSBBcnRpY2xlcyBvbiBBQ0EsIDIwMTEtMjAxNyIpK3RoZW1lX3R1ZnRlKCkreWxhYigiRnJlcXVlbmN5IG9mIFN0ZW0iKSArIHhsYWIoIlRvcCAzMCBVc2VkIFN0ZW0iKQpwCmBgYAoKYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgdGlkeSA9IFRSVUV9CmxvYWQoJ255dGltZXMucmRhJykKTllUX3NvdXJjZSA8LSBWZWN0b3JTb3VyY2UoY29ycHVzJGRvY3VtZW50c1ssMV0pCk5ZVCA8LSBWQ29ycHVzKE5ZVF9zb3VyY2UpCmRvY3VtZW50cyA8LSBjb3JwdXMkZG9jdW1lbnRzCnJlbW92ZU51bVB1bmN0IDwtIGZ1bmN0aW9uKHgpe2dzdWIoIlteWzphbHBoYTpdWzpzcGFjZTpdXSoiLCAiIiwgeCl9CmNsZWFuX2NvcnB1cyA8LSBmdW5jdGlvbihjb3JwdXMpewpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZXBsYWNlX3N5bWJvbCkpCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVXb3JkcywgYyhzdG9wd29yZHMoImVuZ2xpc2giKSwgIndpbGwiLCAiY2FuIikpCiMgV2UgY291bGQgYWRkIG1vcmUgc3RvcCB3b3JkcyBhcyBhYm92ZQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgc3RyaXBXaGl0ZXNwYWNlKQpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlTnVtYmVycykKY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIocmVtb3ZlTnVtUHVuY3QpKQpyZXR1cm4oY29ycHVzKQp9Ck5ZVF9jbGVhbiA8LSBjbGVhbl9jb3JwdXMoTllUKQpOWVRfc3RlbSA8LSB0bV9tYXAoTllUX2NsZWFuLCBzdGVtRG9jdW1lbnQpCm1ldGEoTllUX3N0ZW0sIHR5cGUgPSAibG9jYWwiLCB0YWcgPSAiYXV0aG9yIikgPC0gZG9jdW1lbnRzJGF1dGhvcgpOWVRfZHRtIDwtIERvY3VtZW50VGVybU1hdHJpeChOWVRfc3RlbSkKTllUX3RkbSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoTllUX3N0ZW0pCgpOWVRfdGRtMiA8LSB0aWR5KE5ZVF90ZG0pCk5ZVF9kdG0yIDwtIHRpZHkoTllUX2R0bSkKTllUX3RpZHkgPC0gdGlkeShOWVRfc3RlbSkKTllUX3RkbTIgPC0gbWVyZ2UoTllUX3RkbTIsIE5ZVF90aWR5LCBieS54ID0gImRvY3VtZW50IiwgYnkueSA9ICJpZCIsIGFsbC54ID0KVFJVRSkKTllUX2R0bTIgPC0gbWVyZ2UoTllUX2R0bTIsIE5ZVF90aWR5LCBieS54ID0gImRvY3VtZW50IiwgYnkueSA9ICJpZCIsIGFsbC54ID0KVFJVRSkKCmBgYAoKCl9fRmlndXJlIDE5X18KCiMjIyMjIFdvcmRjbG91ZCBieSBZZWFyCgpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCB0aWR5ID0gVFJVRX0KYXR4dCA8LSBkb2N1bWVudHMkdGV4dHNbZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAgPT0gIjIwMTEiXQpidHh0IDwtIGRvY3VtZW50cyR0ZXh0c1tkb2N1bWVudHMkZGF0ZXRpbWVzdGFtcCA9PSAiMjAxMiJdCmN0eHQgPC0gZG9jdW1lbnRzJHRleHRzW2RvY3VtZW50cyRkYXRldGltZXN0YW1wID09ICIyMDEzIl0KZHR4dCA8LSBkb2N1bWVudHMkdGV4dHNbZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAgPT0gIjIwMTQiXQpldHh0IDwtIGRvY3VtZW50cyR0ZXh0c1tkb2N1bWVudHMkZGF0ZXRpbWVzdGFtcCA9PSAiMjAxNSJdCmZ0eHQgPC0gZG9jdW1lbnRzJHRleHRzW2RvY3VtZW50cyRkYXRldGltZXN0YW1wID09ICIyMDE2Il0KZ3R4dCA8LSBkb2N1bWVudHMkdGV4dHNbZG9jdW1lbnRzJGRhdGV0aW1lc3RhbXAgPT0gIjIwMTciXQoKY2xlYW4udGV4dCA8LSBmdW5jdGlvbih4KQp7CiMgdG9sb3dlcgp4ID0gdG9sb3dlcih4KQojIHJlbW92ZSBydAp4ID0gZ3N1YigicnQiLCAiIiwgeCkKIyByZW1vdmUgYXQKeCA9IGdzdWIoIkBcXHcrIiwgIiIsIHgpCiMgcmVtb3ZlIHB1bmN0dWF0aW9uCnggPSBnc3ViKCJbWzpwdW5jdDpdXSIsICIiLCB4KQojIHJlbW92ZSBudW1iZXJzCnggPSBnc3ViKCJbWzpkaWdpdDpdXSIsICIiLCB4KQojIHJlbW92ZSBsaW5rcyBodHRwCnggPSBnc3ViKCJodHRwXFx3KyIsICIiLCB4KQojIHJlbW92ZSB0YWJzCnggPSBnc3ViKCJbIHxcdF17Mix9IiwgIiIsIHgpCiMgcmVtb3ZlIGJsYW5rIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nCnggPSBnc3ViKCJeICIsICIiLCB4KQojIHJlbW92ZSBibGFuayBzcGFjZXMgYXQgdGhlIGVuZAp4ID0gZ3N1YigiICQiLCAiIiwgeCkKcmV0dXJuKHgpCn0KCmFjbGVhbiA8LSBjbGVhbi50ZXh0KGF0eHQpCmJjbGVhbiA8LSBjbGVhbi50ZXh0KGJ0eHQpCmNjbGVhbiA8LSBjbGVhbi50ZXh0KGN0eHQpCmRjbGVhbiA8LSBjbGVhbi50ZXh0KGR0eHQpCmVjbGVhbiA8LSBjbGVhbi50ZXh0KGV0eHQpCmZjbGVhbiA8LSBjbGVhbi50ZXh0KGZ0eHQpCmdjbGVhbiA8LSBjbGVhbi50ZXh0KGd0eHQpCgphIDwtIHBhc3RlKGFjbGVhbiwgY29sbGFwc2U9IiAiKQpiIDwtIHBhc3RlKGJjbGVhbiwgY29sbGFwc2U9IiAiKQpjIDwtIHBhc3RlKGNjbGVhbiwgY29sbGFwc2U9IiAiKQpkIDwtIHBhc3RlKGRjbGVhbiwgY29sbGFwc2U9IiAiKQplIDwtIHBhc3RlKGVjbGVhbiwgY29sbGFwc2U9IiAiKQpmIDwtIHBhc3RlKGZjbGVhbiwgY29sbGFwc2U9IiAiKQpnIDwtIHBhc3RlKGdjbGVhbiwgY29sbGFwc2U9IiAiKQoKIyBwdXQgZXZlcnl0aGluZyBpbiBhIHNpbmdsZSB2ZWN0b3IKYWxsIDwtIGMoYSxiLGMsZCxlLGYsZykKYWxsIDwtIHJlbW92ZVdvcmRzKGFsbCwgYygid2lsbCIsICJjYW4iLCAidGhlIiwgInRoYXQiLCJhcmUiLCJtcnMiLCJub3QiLCJzYWlkIiwiY291IikpCiMgY3JlYXRlIGNvcnB1cwpjb3JwdXMyIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoYWxsKSkKIyBjcmVhdGUgdGVybS1kb2N1bWVudCBtYXRyaXgKY2xvdWR0ZG0gPC0gVGVybURvY3VtZW50TWF0cml4KGNvcnB1czIpCiMgY29udmVydCBhcyBtYXRyaXgKY2xvdWR0ZG0gPC0gYXMubWF0cml4KGNsb3VkdGRtKQojIGFkZCBjb2x1bW4gbmFtZXMKY29sbmFtZXMoY2xvdWR0ZG0pIDwtIGMoIjIwMTEiLCIyMDEyIiwiMjAxMyIsIjIwMTQiLCIyMDE1IiwiMjAxNiIsIjIwMTciKQpjb21wYXJpc29uLmNsb3VkKGNsb3VkdGRtLCByYW5kb20ub3JkZXI9RkFMU0UsY29sb3JzID0gYnJld2VyLnBhbCg4LCAiRGFyazIiKSx0aXRsZS5zaXplPTEuNSwgbWF4LndvcmRzID0gMjAwKQpgYGAK